人気ブログランキング | 話題のタグを見る
On Lisp 第7章 マクロ
いよいよ本番。
マクロなんてほとんど使った事のないヘタレなので、話の内容が新鮮。

マクロ定義とは実質的にLispコードを生成する関数だ
-- つまりプログラムを書くプログラムだ。

7.1 マクロはどのように動作するか
- 関数 => 結果
マクロ => 式 => 結果

- マクロ呼び出し
1. 与えた定義の指定した式を生成
2. 生成した式を元のマクロ呼び出しの場所で評価する

7.2 バッククォート
- バッククォートは特別なクォート
(equal `(a b c) '(a b c))               ;=> T
(equal `(a b c) (list 'a 'b 'c)) ;=> T

- バッククォート内のカンマ => 評価の保護をやめる
(setq b 1
d 2)
(equal `(a ,b c ,d) (list 'a b 'c d))
;=> (equal `(a 1 c 2) (list 'a 1 'c 2))
;=> T

;; リストが入れ子でも機能する
`(a (,b c))
;=> (A (1 C))

- 1個のカンマは1個のバッククォートの効果を打ち消す
# やばい、だんだん混乱してきたw
`(a (`,b c))
;=> (A (B C))

- カンマアット (,@) は、一番外側の括弧を取り除いて挿入
(setq b '(1 2 3))
`(a ,b c)
;=> (A (1 2 3) C)
`(a ,@b c)
;=> (A 1 2 3 C)

- ,@ の制限事項
- シーケンス内になければいけない
- 切り貼りされるオブジェクトは、最後に来ない限りリストでなければならない
(setq b 1)
`(a ,@b)
;=> (A . 1)
`(a ,@b c)
;=> ERROR!!


7.4 マクロ展開の確認
- macroexpand, マクロ展開関数
- macroexpand-1, マクロを一段階だけ展開
=> タイプ数節約のため、代わりにこんなマクロを定義
(defmacro mac (expr)
`(pprint (macroexpand-1 ',expr)))

- マクロ展開は、マクロの書き方の勉強手段でもある。
=> マクロの展開形を見て、どう書かれたのかを調べる。

7.7 プログラムとしてのマクロ
- マクロ展開では、gensym の返す特別な無名シンボルを使う

7.8 マクロのスタイル
- マクロ定義に関わる二種類のコード
- 展開コード => 明確さ優先
- 被展開コード => 効率優先

7.9 マクロへの依存
- 1. マクロはそれを呼び出す関数 (またはマクロ) の前で定義する。
2. マクロが再定義されたときは、
それを (直接または間接的に) 呼び出している関数とマクロを
すべて再コンパイルする


On Lisp
Paul Graham

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

Amazonで詳しく見る
by G-Tools
by fkmn | 2009-11-10 23:55 | 一人読書会
<< On Lisp 第8章 いつ... On Lisp 第6章 表現と... >>


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