2011-03-14 94 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)