プログラミングを頑張る日記

プログラミングを勉強して、ハッカーになろう

Common Lispを頑張る(13)

今日も今日とてCommon Lispです。
昨日の続きで、3種類のフォームについての話からです。
関数呼び出しフォーム、マクロフォーム、特殊フォームがあるそうですが、
まずは関数呼び出しフォームの説明です。

関数呼び出し

先頭以外のリストの要素を評価し、その結果の値を関数に渡すのが
関数呼び出しフォームの評価ルールだそうです。

う〜ん、特に感想がないです。次行きます。

特殊オペレータ

特殊オペレータというのは、条件判定のやつとかですね。ifとかcond。
関数呼び出しみたいに先頭以外の要素を順次評価してはイケません。
場合によっては評価したくないから条件判定してるわけで。
「Land of Lisp」でも触れたところですね。

というわけでリストの先頭要素が特殊オペレータの名前だった場合、
式の残りはその特殊オペレータのルールに従って評価されるとのこと。
これだ!という定義は無いようです。まあ特殊なんですもんね。

マクロ

ついにマクロについての話が来ました。集中して読みます。
特殊オペレータを使うと、Lispシンタックスを拡張して
通常の関数呼び出しではできないことができます。
ただしそれも言語仕様の中での話であります。
対してマクロは言語のシンタックスそのものを拡張する手段だそうです。

マクロはS式を引数として評価されていない状態で受け取り、
マクロ関数が返すフォーム(マクロの展開)が通常の評価手順で評価されるそうです。

マクロにはこの2段階があることをしっかり理解しておく必要があると
参考書は強調しています。Lispコードをコンパイルする際に
この2段階は全く別のタイミングで起きることだそうです。
第1段階はコンパイル時に起きるようですね…。第2段階はもちろん実行時のようです。
あれ、なんか勘違いしている気がする。マクロの展開が第一段階ですね。
上の説明だとなんかごっちゃになってました。

評価機はマクロ関数に投げる前にマクロフォームの要素を評価しないそうで、
つまりマクロの中では書きたいように書けるってことですね。
あ、もっといい感じにまとめられていました。
それぞれのマクロが自分自身にローカルなシンタックスを定義する、そうです。

なるほど…他の言語でも「どうしてこういう風に書けないんだろう」と思うこと
ありますものね。Lispなら「どうしてこういう風に書けないんだろう…
書けるようにするか」となれるわけですね。
皆がマクロの自慢をする理由が少しわかった気がします。

真偽値

TとNILの話です。とはいえ新しい話はあまりないですね。
両方共自己参照型のシンボルなので、tもt'も一緒です。
nilに至ってはnilも'nilも()も'()も全部おんなじNILです。

と、ここでLispにおける等しさとは、という話になります。
いろいろな比較の説明が入ります。
「Land of Lisp」では逃げましたが、少しやります。

EQ:『オブジェクト同一性』を比較する。
   数値や文字列になりうるものの比較に使うべきではない。
   処理系が変わると動作が変わる可能性がある。
EQL:同じ数値や文字の値を表している同じクラスのものの比較で
   真を返すと保証されている。
この2つのうちどちらを基本的に使うべきかに関しては論争があるようです。
コンラッドさんのルールではシンボルだとわかっているならEQ、
それ以外ならEQLだったような気がしますが、この本は常にEQL派のよう。
EQを使ってたら、コードレビューする人もいちいち不適切な使われ方が
されていないか気にしてしまう、というのが理由として気に入りました。

あ、比較としてはやっぱりこの2つを抑えておけばいいみたいです。

この章の残りは読みやすく書こうねって話でした。
コメントはセミコロンを1〜4個置いて書くみたいです。

今日は短めです。金曜日なので。
おやすみなさい。