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