人気ブログランキング | 話題のタグを見る
On Lisp 第9章 変数捕捉
 慣れるまでは、マクロを使う際に変数名の衝突ではまりそうで怖い。とりあえず、gensym 使っておけば大丈夫っぽく思えるけど、どうなんだろ。
 それから、Common Lisp の defmacro と Scheme の「健全なマクロ」の違いについてよくわかってないので、後で勉強する。

9.4 適切な名前によって捕捉を避ける
- Common Lisp のグローバル変数には、
先頭と末尾にアスタリスクがつく名前を付けるのが伝統
(例) *package*

9.5 事前評価によって捕捉を避ける
- 危険のある引数を、マクロ展開で作られる束縛よりも外で評価する。
=> 例えば、マクロを let で始める

9.6 Gensym によって捕捉を避ける
- 捕捉されうるシンボルを gensym で置き換える
<= マクロの変数捕捉を避ける確実な方法

9.7 パッケージによって捕捉を避ける
# パッケージについて:
# - defpackgage でパッケージを定義
# - in-package でカレントパッケージを指定、
#
# 参考: パッケージを作りたい
# シンボルとパッケージ

9.8 その他の名前空間に置ける捕捉
- do は暗黙のうちに、nil という名前のブロックに囲まれる
(block nil
(list 'a
(do ((x 1 (1+ x)))
(nil)
(if (> x 5)
(return-from nil x)
(princ x)))))
;=> (A 6)
* 外側で明示的に指定されている nil ブロックから抜けているつもりが、
暗黙に作られた do のすぐ外の nil ブロックに捕まってしまい、
結果として評価値が (A 6) になってしまっている。

(block foo
(list 'a
(do ((x 1 (1+ x)))
(nil)
(if (> x 5)
(return-from foo x)
(princ x)))))
;=> 6
* 外側のブロックを nil 以外の名前にすれば、無事に抜けられる

(block nil
(list 'a
(do ((x 1 (1+ x)))
(nil)
(if (> x 5)
(return x)
(princ x)))))
;=> (A 6)
* return は、暗黙的に作られた nil ブロックから抜ける


On Lisp
Paul Graham

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

Amazonで詳しく見る
by G-Tools
by fkmn | 2009-11-15 23:55 | 一人読書会
<< On Lisp 第10章 マ... MacPorts で Merc... >>


とある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