バリケンのRuby日記 RSSフィード

2008-03-25

[] マクロ(1)  マクロ(1) - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  マクロ(1) - バリケンのRuby日記  マクロ(1) - バリケンのRuby日記 のブックマークコメント

今日は、マクロについて勉強するよ。

マクロ

前回のように、たとえばifのような制御構造を自分で定義したいときには、関数定義ではダメなことがわかったよね。

じゃあ、自分で制御構造を実装したいときにはどうしたらいいかな?それを実現するのがマクロだよ。

とりあえずマクロについての詳しい話は横に置いておくけど、マクロは、defmacroで定義することができるよ。たとえば昨日のmyifなら、defunじゃなくてdefmacroなら、期待通りの動作をさせることができるよ。

[1]> (defmacro myif (a b c) (or (and a b) c))
MYIF
[2]> (myif t 1 2)
1
[3]> (myif nil 1 2)
2
[4]> (myif t (print "Hello1") (print "Hello2"))

"Hello1"
"Hello1"
[5]> (myif nil (print "Hello1") (print "Hello2"))

"Hello2"
"Hello2"
[6]>

でも実は、この定義の仕方は良くないみたい。defmacroのちゃんとした使い方は後日勉強するよ。

Lispの式は、マクロ展開されてから評価されるみたいだよ。どのようにマクロが展開されるかを見るには、macroexpandを使うよ。

実はこのあいだ出てきたcond式はマクロで実装されているみたいだから、cond式をmacroexpandでマクロ展開してみるよ。

[6]> (macroexpand '(cond (cond-exp1 exp1) (cond-exp2 exp2) (t else-exp)))
(IF COND-EXP1 EXP1 (IF COND-EXP2 EXP2 ELSE-EXP)) ;
T
[7]>

cond式は、実はif式の組み合わせで出来ているんだねえ。

トラックバック - http://rubyist.g.hatena.ne.jp/muscovyduck/20080325