История изменений
Исправление monk, (текущая версия) :
биндинг в let должен связываться не в at-compile
Тогда при компиляции макрос работать не будет. Так как в at-compile есть закрытый список toplevel форм, которые выполняются. let (и всё, что внутри него) не выполняется.
почему в cl это работает
Так написан стандарт. Я в Racket первое время всё напарывался на то, что (let ([a #f]) (define (foo ...) ...) (define (bar ...) ...) (void)) не определяет функции. Ибо внутри let они локальные.
А в CL порядок компиляции описан вполне строго в стандарте. Он позволяет делать всякие извраты с eval-when (например, поставить :compile без всего остального — при компиляции работает, при загрузке из исходников — нет), но в любом случае достаточно детерминирован. И если где надо втыкать (eval-when (:compile-toplevel :load-toplevel :execute), то даже одинаково себя ведёт при любом режиме компиляции/загрузки/запуска программы.
Исходная версия monk, :
биндинг в let должен связываться не в at-compile
Тогда при компиляции макрос работать не будет. Так как в at-compile есть закрытый список toplevel форм, которые выполняются. let (и всё, что внутри него) не выполняется.
почему в cl это работает
Так написан стандарт. Я в Racket первое время всё напарывался на то, что (let ([a #f]) (define (foo ...) ...) (define (bar ...) ...) (void)) не определяет функции. Ибо внутри let они локальные.
А в CL порядок компиляции описан вполне строго в стандарте. Он позвоялет делать всякие извраты с eval-when (например, поставить :compile без всего остального — при компиляции работает, при загрузке из исходников — нет), но в любом случае достаточно детерминирован. И если где надо втыкать (eval-when (:compile-toplevel :load-toplevel :execute), то даже одинаково себя ведёт при любом режиме компиляции/загрузки/запуска программы.