Freenode的#scheme頻道詢問了一個很好的問題。請看下面的代碼方案:計劃中的宏和內部定義
(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
應該產生語法錯誤的嗎?而哪個做?我已經用赤壁計劃檢查了這個,其中beta
很好,而gamma
和delta
失敗。我想知道這是一個有意的行爲還是僅僅是赤壁的一個bug。
根據該標準,在內部定義被重寫爲letrec*
之前,擴展宏似乎應該發生。因此beta
和gamma
都應該都失敗,因爲foo
將與內部定義的alpha
匹配,而不是全局匹配。
但是,沒有明確的標準規定內部定義是如何工作的,只是他們可以被作爲letrec快捷想到的。我使用Racket的R5RS獲得了相同的行爲,所以看起來我錯過了標準中要求這種行爲的東西。
在R6RS(基於psyntax的impl)中,調用過程時我得到相同的行爲。 – leppie 2014-09-26 07:40:54