История изменений
Исправление ilammy, (текущая версия) :
Как это можно сделать на этапе раскрутки макроса, а не в рантайме? Хотя я и в рантайме это пока не придумал.
Хотя бы так:
(define-syntax iota
(syntax-rules ()
((_ xs) (iota xs ((+))))
((_ () is) is)
((_ (x . xs) (ii ... (i ...)))
(iota xs (ii ... (i ...) (i ... 1)))) ) )
Я так пробовал сделать, но до макроса дело не дошло, потому что скорость не понравилась.
Зависит от реализации case-lambda, скорее всего. Для какой-нибудь реализации с более агрессивным статическим анализом она может быть быстрее ручного разбора списка. Но Chibi это ж интерпрератор, case-lambda там разворачивается в пачку if по длинам списков аргументов и последующим apply. Так что да, я не думаю, что там такой вариант будет быстрее варианта в лоб от Монка.
Исходная версия ilammy, :
Как это можно сделать на этапе раскрутки макроса, а не в рантайме? Хотя я и в рантайме это пока не придумал.
Хотя бы так:
(define-syntax iota
(syntax-rules ()
((_ xs) (iota xs ((+))))
((_ () is) is)
((_ (x . xs) (ii ... (i ...)))
(iota xs (ii ... (i ...) (i ... 1)))) ) )
Я так пробовал сделать, но до макроса дело не дошло, потому что скорость не понравилась.
Зависит от реализации case-lambda, скорее всего. Для какой-нибудь реализации с более агрессивным статическим анализом она может быть быстрее ручного разбора списка. Но Chibi это ж интерпрератор, case-lambda там в пачку if по длинам списков аргументов и последующим apply. Так что да, я не думаю, что там такой вариант будет быстрее варианта в лоб от Монка.