人気ブログランキング | 話題のタグを見る
On Lisp 第10章 マクロのその他の落とし穴
 評価の順番が問題になる例がヤバい。こんなのに遭遇したら、かなりの時間を取られそう。
 副作用と再帰に関しては、マクロ展開の結果がイメージできていれば、避けるのはそんなに難しくない気がする。

10.2 評価の順番
- 評価の順番が問題になる例
(defmacro for ((var start stop) &body body)
(let ((gstop (gensym)))
`(do ((,gstop ,stop)
(,var ,start (1+ ,var)))
((> ,var ,gstop))
,@body)))

(let ((x 1))
(for (i x (setq x 13))
(printc i)))
;=> 13
; NIL

stop "(setq x 13)" の副作用で、ループの初期値が 13 になってしまう。
# うーん、このハマリ方はわかりづらい・・・

10.3 マクロ展開関数の副作用
- 展開を行うコードは引数として渡された式にのみ依存すべきで、
値を返す他には周囲の世界に影響しようとすべきではない。
# この原則が重要そう。
# これさえ守っておけば、上の例のような問題は起きないはず。

10.4 再帰
- 末尾再帰関数は、反復形に変換してマクロのひな形に使う事が容易
; 末尾再帰関数
(defun ntha (n lst)
(if (= n 0)
(car lst)
(nsta (- n 1) (cdr lst))))

; 反復形に変換したマクロ
(defmacro nthc (n lst)
`(do ((n2 ,n (1- n2))
(lst2 ,lst (cdr lst2)))
((= n2 0) (car lst2))))


- マクロの引数そのものについての再帰は可能 (引数を無限に重ねる事はできない)
- マクロ引数の値に対する再帰は不可能 (無限ループ!)


On Lisp
Paul Graham

4274066371
オーム社 2007-03
売り上げランキング : 82240
おすすめ平均 star

Amazonで詳しく見る
by G-Tools
by fkmn | 2009-11-17 23:55 | 一人読書会
<< 「入門Git」は噂通りの神本だった On Lisp 第9章 変数捕捉 >>


とあるWebアプリケーションエンジニアの日記

by fkmn
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
カテゴリ
以前の記事
ブログパーツ
リンク
検索
タグ
最新のトラックバック
その他のジャンル
ファン
記事ランキング
ブログジャンル
画像一覧

fkmnの最近読んだ本 フィードメーター - フッ君の日常 あわせて読みたい AX