Хороший вопрос был задан на канале #scheme Freenode. Рассмотрим следующий код на схеме:Макросы и внутренние определения на схеме
(define alpha 1)
(define-syntax foo
(syntax-rules (quote alpha)
((_ alpha msg) (define bar 2))
((_ other msg) (syntax-error msg))))
(define (beta)
(foo alpha "beta")
(define alpha 3)
'beta)
(define (gamma)
(define alpha 4)
(foo alpha "gamma")
'gamma)
(define (delta alpha)
(foo alpha "delta")
'delta)
какие из beta
, gamma
и delta
должны производить синтаксические ошибки? И какие сделать? Я проверил это с Chibi Scheme, где beta
в порядке, а gamma
и delta
сбой. Интересно, является ли это предполагаемым поведением или просто ошибкой в Chibi.
Согласно стандарту, кажется, что расширение макросов должно происходить до того, как внутренние определения будут переписаны в letrec*
. Таким образом, beta
и gamma
должны оба сбой, так как foo
будет соответствовать внутренне определенному alpha
, а не глобальному.
Однако явно не указано в стандарте как внутренние определения фактически работают, только то, что они могут рассматривать как letrec ярлык. Я получаю такое же поведение с R5RS Racket, так что кажется, что я пропускаю что-то в стандарте, который требует такого поведения.
В R6RS (psyntax based impl), я получаю такое же поведение при вызове процедур. – leppie