LINUX.ORG.RU

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

Исправление 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. Соответственно, если хочешь чтобы функция была доступна и во время раскрытия и во время компиляции/выполнения, нужно определить ее дважды (или сделать макрос, определяющий ее для обоих фаз).