Схема: Передача определения внутри макроопределения в submacro?
Рассмотрим следующее определение макроса в схеме R7RS:
(define-syntax foo
(syntax-rules ()
((_ bar)
(begin
(define baz 42)
(define-syntax bar
(syntax-rules ()
((_) baz)))))))
Я загрузил этот файл в ответ chibi-scheme
и вошел:
> (фу бар)
> (бар)
Вместо ожидаемого выхода 42
, Я получил:
ОШИБКА: неопределенная переменная: baz
Почему это так и как я могу передать определенное значение baz
во внешнем макросе к внутреннему макросу?
2 ответа
Это ошибка в чиби-схеме. Определение макроса должно охватывать его среду; за bar
среда состоит из bar
сам и baz
, Затем, когда вы расширяете bar
в другой среде расширение макроса должно признать, что baz
связан в env-of-Definition. схема чиби, видимо, не признает, что baz
на самом деле определяется.
Кроме того, еще одна связанная проблема, которую вы не видели в своем посте, заключается в том, что даже если расширение bar
признает baz
при загрузке / выполнении кода необходимо найти значение baz
,
Вот схема R6RS Ikarus:
> (define-syntax foo
(syntax-rules ()
((_ bar)
(begin
(define baz 42)
(define-syntax bar
(syntax-rules ()
((_) baz)))))))
> (foo bar)
> (bar)
42
>
Я выполнил это на всех схемах в моем тестовом наборе, которые поддерживают синтаксические правила, и это не работает только на Chibi и MIT. Я не вижу причин, почему это не должно работать, но я признаюсь, что макрология все еще является чем-то вроде черного искусства для меня. В частности, это работает в Foment, который является системой R7RS. Я не смог построить Стрелец, поэтому я не могу проверить его там.