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系ソースコード書くにはつらいです・・・