2010-02-01から1ヶ月間の記事一覧

もうちょっと

gosh> (define-macro hoge 'hoge) *** ERROR: Compile Error: procedure required, but got hoge "(stdin)":1:(define-macro hoge 'hoge) Stack Trace: _______________________________________ マクロは0個以上の引数を取る、手続きと同じ形でなくてはなら…

マクロ定義の練習

今回はid:yagiey:20100126:1264525307で紹介したレガシーなマクロに関して。っていうか前回もだったけど。 id:yagiey:20100213:1266088272で 「新たな変数名を作り出す」という要請に対しての解決策という形で紹介される伝統的なマクロを次回。 といってみた…

やっと分かった

ずっと (define-macro (my-when test . body) `(if ,test (begin . ,body))) が理解できなかった。具体的に言うと、 (my-when (even? 4) 1 2 3 4) って使うと、,testが#tになると思い込んでいたので、,bodyが(1 2 3 4 5)という関数適用でエラーにならないこ…

R5RSマクロの限界

Schemeのマクロには大きく分けて R5RSマクロ:パターンマッチによるマクロ レガシーなマクロ:LISPに伝統的なマクロ があるとid:yagiey:20100126:1264525307で紹介した。 今回は後者に関して。 R5RSマクロは以下のようなマクロを実現できない、もしくは実現…

メッセージ

id:yagiey:20100210:1265827551のmake-accountのところで、 make-accountの戻り値は「第1引数に操作の名称を受け取る手続き」ですが、それはまた、「第1引数にメッセージを受け取るオブジェクト」と解釈することもできます。 (p269)という記述がある。 自…

マクロの使用例

マクロ定義の実例として、簡単なオブジェクトシステムを書くことを想定したケースが紹介されている。ここで登場するオブジェクトは、以下のような銀行口座を表すオブジェクト。(以下のC#コードは動作確認してません) using Sysmtem; public class Account …

マクロをいつ使うか

letはlambdaによる無名関数の適用へと展開される(id:yagiey:20100128:1264705405)。 だからletは(仕様が要求するけど)必須構文ではない。 だけどletによって「ローカル変数」という概念ができる。 このように、 そのマクロによってまとまった、明確な抽…

if文

else ifを使ったら最後に必ずelseが必要だと思っていた。恥ずかしながら。 if (cond1) proc1(); else if (cond2) proc2(); else proc3(); みたいな。 ここで、もし、proc3で特に何もやることが無い場合、 else nop(); // nop()は何もしない関数 とか、 else …