История изменений
Исправление korvin_, (текущая версия) :
Я из этого (неверно) понял, что нельзя внутри define-syntax сделать ещё раз define-syntax и сразу выполнить.
У меня и не делается define-syntax внутри define-syntax. У меня первый макрос генерирует код, в котором определяется второй. Так же как и в твоем CL-коде.
Та фраза означает, что ты не можешь сделать так:
(define (transpose vars vals)
(map list vars vals))
(defmacro foos (vars vals)
(let ((binds (transpose vars vals)))
`(quote ,binds)))
(foos (x y z) (1 2 3))
; . . ..\..\Program Files\Racket\collects\racket\private\modbeg.rkt:46:4: transpose: undefined;
; cannot reference an identifier before its definition
; phase: 1
; explanation: cannot access the run-time definition
Нужно определять transpose через define-for-syntax, а не define. Соответственно, если хочешь чтобы функция была доступна и во время раскрытия и во время компиляции/выполнения, нужно определить ее дважды (или сделать макрос, определяющий ее для обоих фаз).
теперь буду пытаться понять, как оно работает без цикла по переменным
Паттерн-матчинг же.
Исходная версия korvin_, :
Я из этого (неверно) понял, что нельзя внутри define-syntax сделать ещё раз define-syntax и сразу выполнить.
У меня и не делается define-syntax внутри define-syntax. У меня первый макрос генерирует код, в котором определяется второй. Так же как и в твоем CL-коде.
Та фраза означает, что ты не можешь сделать так:
(define (transpose vars vals)
(map list vars vals))
(defmacro foos (vars vals)
(let ((binds (transpose vars vals)))
`(quote ,binds)))
(foos (x y z) (1 2 3))
; . . ..\..\Program Files\Racket\collects\racket\private\modbeg.rkt:46:4: transpose: undefined;
; cannot reference an identifier before its definition
; phase: 1
; explanation: cannot access the run-time definition
Нужно определять transpose через define-for-syntax, а не define. Соответственно, если хочешь чтобы функция была доступна и во время раскрытия и во время компиляции/выполнения, нужно определить ее дважды (или сделать макрос, определяющий ее для обоих фаз).