2016年9月13日

実践common lisp第3章

この段階でこの章の内容を正しく理解しようとは思わないほうがいいかも
とてもじゃないけど理解できるような代物じゃないかな

先ず属性リスト、これは連想配列と似ているものですね
dic["title"] = "title"
のようなもの

formatの書式指定子でチルダが登場するところがLispっぽいところなのでこのあたりは存分に堪能しましょう

#'について、Common Lispでは名前空間が関数と変数で分かれているのでこういうものが必要になる
ここに単純にevenpと書いてしまうとそれは変数の名前空間を検索することになるのですよ
#'evenpと表記することによってevenpは関数の空間に属しているのでそちらから探してねっていうことになる
だから、evenpと言う関数と変数があっても問題ない
例えばJavaScriptなんかだと、名前空間が関数と変数でわかれていないからevenpって言う関数を定義して、さらにevenpって言う変数を定義したらevenpは変数になっちゃってevenpの関数にアクセスできなくなるわけで、どちらが良いとかじゃなくて根本的な考え方の違いでこういうことになっているところが注意点ですかね
この違いは高階関数が記述できるものでとくに違いが顕著になりますね
多分CとかC++なんかでも名前空間は別れてないんじゃないかな
C#も分かれてなくてとにかく関数、変数ごっちゃで管理して、それぞれに属性情報が付与されてそう

whereについてどうこう言っているあたりは、要はコンパイル時に判明することはコンパイル時に解決して実行時までもちこさないようにしましょうと言うことを言っている
つまりタイトルだけで検索したいときにいちいちアーティストについてとやかく言うのは無駄以外のなにものでもないと
そして普通のプログラミング言語においては、無駄でもいちいちifを動作させて、無駄と知っていてもいちいち条件分岐を実行させるのだけど、Common Lispにおいてはそんな無駄なことしなくてもいいよって言っている
厳密に言うと他のプログラミング言語でも無駄を省くことは可能なのだけど、そうするためにはいちいち条件文をソースに記述してまわらないといけないんだよね
ifで無駄な条件分岐させるか、いちいち効率的なコードを書いてまわるかのどちらか
でも、Common Lispでは標準でコード生成の仕組みが用意されているので効率的に実行できるコードをコンパイラに記述させることができるといっている
whereをマクロにすることによって、アーティストが必要なところではアーティストのみ、タイトルが必要なところではタイトルのみ検索対象とするような効率的なコードを生成することが簡単にできると言いたい
要は自慢ですね、だから訳分かんなくてもまったく気にする必要ないですけど、いつかはものにできるといいですね