Schemeな日々その5

マクロの理解が怪しいので復習。fluid-letマクロを自力で追ってみる。

;fluid-letの呼び出し
(fluid-let ( (x 9) (y (+ y 1))) (+ x y))

;fluid-letマクロ
(define-macro fluid-let
;以下、fluid-letマクロの動作をトレース
  (lambda (xexe . body)
  ;lambda xexe:( (x 9) (y (+ y 1))) body( (+ x y))
    (let ( (xx (map car xexe))
  ;ローカル変数xxを定義、値はxx:(x y)
          (ee (map cadr xexe))
      ;ローカル変数eeを定義、値は(9 (+ y 1))
          (old-xx (map (lambda (ig) (gensym)) xexe))
      ;ローカル変数old-xxを定義、値は(g1004 g1005)
          (result (gensym)))
      ;ローカル変数resultを定義、値はg1006
      `(let 
    ;テンプレート (let
      ,(map (lambda (old-x x) `(,old-x ,x)) old-xx xx)
    ;評価した値 ( (g1004 x) (g1005 y))
         ,@(map (lambda (x e) `(set! ,x ,e)) xx ee)
     ;評価結果を挿入 (set! x 9) (set! y (+ y 1))
         (let ( (,result (begin ,@body)))
     ;ローカル変数g1006を定義 値は(+ x y)の評価値
           ,@(map (lambda (x old-x) `(set! ,x ,old-x)) xx old-xx)
       ;x yの値を戻す (set! x g1004) (set! y g1005) 
           ,result)))))
       ;resultを全体の評価とする

ここまで来るのに1時間くらい悩んだ。理解力の無さに凹む(^^;
※連続する括弧で囲まれた部分が脚注にされてしまう。Lispソースコード書くにはつらいです・・・