2011-03-14 10 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 

誰かが私にこれら2つのプログラムが異なる理由を教えてもらえますか?

+1

これは、MITスキームを実行しないで、推測したものですが、翻訳したコード(リストid)を '(id)'に持ち上げる際に同じものではありません。 (list id)は、マクロが展開されるたびに識別子id、つまり(cadr形式)でバインドされたシンボルで新しいリストを作成します。しかし、 '(id)はシンボル "id"のリテラルリストです。したがって、let1は(list id)を '(a)に展開し、let1-errorはそれを'(id)に展開します。私はMITスキームのためにそれが何であるかは分かりませんが、マクロ展開プロシージャでこれを確認することができます。 –

答えて

0

あなたの問題を持つ可能性があります:

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

以前のバージョンにそれを比較してください。

代わりに、代わりに(list id)が必要です。

関連する問題