星田さんの記事に対するコメント。
関数形式でIFっぽい動作を定義した場合は狙い通りに動かない
ははぁ!なるほど!「これはマクロじゃないと実現できない」とかの基準は何なんだ?と思ってたけど、これは納得。思わぬ記事が役に立ったなぁ。
マクロは関数と異なり、受け取った引数をすぐには計算しない。
これがあるから「式のパターンを並べ替える」って事が出来るわけ。
また、マクロは遅延評価と密接な関係があって、と言うよりSchemeの遅延評価はそもそもマクロベッタリだ。
実はこの辺で、プログラミング言語の論争があって、「完全に遅延評価なプログラミング言語」、例えばHaskellのような言語だと、マクロ不要論、ってのが出る原因になっている。
つまり、完全な遅延評価の言語だと関数を書く事自体がマクロを書くのと同じだろ、ってのが論拠になってる。
なお、Thunkの使い方として、
ってのはアリだ。
と言うより、こういうクロージャのメンドい使い方を避ける為にマクロがある、と言う見方も出来る。
Syntax-rulesとSICPを組み合わせて検索したら何か出るかな?と思ったらQiitaのページで「SICPにはSyntax-rulesはほとんど無い」という部分でヒット。無いのか〜・・
殆どない、と言うよりも全くない、って言ってもいいかも。
正確に言うと、R4RSのAppendixにはマクロに対する案が記述されてるんだけど、これってオマケなんだよね(苦笑)。実装したいヤツはしてみれば?ってな話で実は要求じゃないんだ。
つまり、SICPは真正面からマクロを扱えない本になってるわけ。そのクセ、遅延評価に大量のページを割いてんだけど、そこを演習する材料をR3RS/R4RSじゃ作れない、ってオチになってんのね。
だからある程度Schemeを分かってSICPを読むのを妨げる事はないんだけど、プログラミング初学者相手だとワケワカメな本なのは事実なのよ(笑)。だからちょこちょこ大事な事は書いてて役立つんだけど、本全体としては僕は評価してない、ってのはそれが理由。本一冊で完結してないんだ(だからPAIPの方をより高く評価してる)。