LINUX.ORG.RU

История изменений

Исправление 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. Так что да, я не думаю, что там такой вариант будет быстрее варианта в лоб от Монка.