Схема: Передача определения внутри макроопределения в 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. Я не смог построить Стрелец, поэтому я не могу проверить его там.

Другие вопросы по тегам