2011-03-14 95 views
2

我試圖通過玩弄MIT-Scheme documentation中找到的一些代碼來了解它。 一段代碼約SC-宏觀變壓器:這兩個方案代碼有什麼區別(宏)

(define-syntax let1 
     (sc-macro-transformer 
     (lambda (form env) 
      (let ((id (cadr form)) 
       (init (caddr form)) 
       (exp (cadddr form))) 
      `((lambda (,id) 
       ,(make-syntactic-closure env (list id) exp)) 
       ,(make-syntactic-closure env '() init)))))) 

    ;(let1 a 1 (+ a 1)) 
    ;Value: 2 

,但我不知道是否可以採取「化妝語法閉合」的部分來自'拉姆達...來的身體「,讓..「和程序變成:

(define-syntax let1-error 
    (sc-macro-transformer   
     (lambda (form env) 
     (let ((id (cadr form)) 
       (init (make-syntactic-closure env '() (caddr form))) 
       (exp (make-syntactic-closure env '(id) (cadddr form)))) 
    ;; (pp `(id:,id)) 
    ;; (pp `(init:, init)) 
    ;; (pp `(exp:, exp)) 
    `((lambda (,id) 
    ,exp) 
,init))))) 
;(let1-error a 1 (+ a 1)) 
;Unbound variable: a 

有人可以告訴我爲什麼這兩個程序是不同的?

+1

這只是一個沒有運行MIT方案的猜測,但是將您翻譯的代碼(列表id)提升爲'(id),這不是同一件事。 (列表ID)每次擴展宏時創建具有由標識符ID(即,(cadr形式))綁定的符號的新列表。但是,'(id)是符號「id」的文字列表。因此let1將(列表id)展開爲'(a),而let1-error展開爲'(id)。你應該能夠用宏擴展程序來檢查這個,但我不知道MIT的方案具體是什麼。 –

回答

0

你的問題很可能有:

(make-syntactic-closure env '(id) (cadddr form))) 

與此相比,上一版本。

你可能希望那是(list id)