2016年9月16日

実践common lisp第7章

いきなりわけわかんない、いつものLisperウザいって言う形容詞がぴったりの文章が始まりますけどここは一つ深呼吸して心を落ち着けて欲しいところですね
ここでは非常に重要なことを言っているんですよね
「コアに標準ライブラリを追加したもの」って言う点なんですけど、理解されていない方が多いと感じるのがこれで、言語としての機能とライブラリでの機能とごっちゃになっちゃってるんですよ
だからLispって標準ライブラリが昨今の開発環境の中ではそうとう貧相だから敬遠されているのですけど、Common Lispって別に標準ライブラリで勝負していないんですよね
標準ライブラリを含めない言語のコア機能だけで見た時、Common Lispは素晴らしいものだと言うことを理解してほしいです
残りで紹介しているものは本当に些細な例です
ここでなんじゃこりゃって思わないでほしいな
って言うか改めてここを読み返してみても酷いと思うわ
whenが標準で用意されていないとでも見受けられるこの部分は酷いよね
でも、これは逆にこういうことも自分で思い通りにすることができると言う、是非前向きに捉えていただきたいと思います
しかも追い打ちをかけるようにwhenはこうやってdefmacroで実装できるって、これ完全に追い打ちの泣き面に蜂以外のなにものでもない
この時点でこんなもん提示されて分かるわけ無いんだよね
ちなみにソースコード上でのカンマが区切り文字に見えなくなったらかなり達者になったと思ってもいいんじゃないでしょうか
ちなみにこのwhenについて説明すると
(defmacro when (condition &rest body)
  `(if ,condition (progn ,@body)))
と言うマクロは、こんなソースコード
(when (spam-p current-message)
  (file-in-spam-folder current-message)
  (update-spam-database current-message))
を、こう
(if (spam-p current-message)
  (progn
    (file-in-spam-folder current-message)
    (update-spam-database current-message)))
変形させる
まずバッククオートで囲まれているものはそのまま出力されるので
ifが出力される
次のconditionはカンマが付いているので、置き換えられる
置き換え対象はwhenマクロ呼び出し時の第一引数である(spam-p current-message)
そして次のprognもそのまま出力される
最後に残ったbodyには,@が付いているので第二引数以降のもの、つまりリストが展開されて出力される
そうすることによって自分でifなになにprognなになにって言うのを自分で入力したものとまったく同じものを得ることができるというわけですね