2016年9月14日

実践common lisp第4章

ここでは、とにかくこれですね
(function-name arguments*)
Lispのコンパイラが比較的簡単に作れる理由がこれ
ソースコード上はfunction-nameの部分がマクロだったり特殊オペレータだったりするのだけど、一見するとソースコード上では区別がつかないので、こう覚えてしまっても差し支えないかな
逆に、これだけ単純なんだということがわかればいいのではというくらい
他の言語みたいに文だ式だ二項だ単項だとか宣言だとかそういったことなんもなくてとにかく全部これで記述できるんだよね
あと、後々でてくるのだけど、いわゆる変数宣言も関数で表現するのがCommon Lispの素晴らしいところですね
特殊オペレーターについては、一言で言うと関数では実現できないものを特殊オペレーターとして実現していると言うこと
だけど、ソースコード上では区別する必要がない、し、わざわざ区別させないようにしたのだろう
例えば、JavaScriptだったとすると、JavaScriptだったらシンタックスは比較的緩めかもしれないけど、じゃあJavaScriptソースを入力として受け取るものを作ろうって思うと結構大変だと思うんだよね
例えば関数宣言、変数宣言、代入してるとか、っていうものを解析しようと思うと正規表現ではとてもじゃないけど手に負えないような代物なんですけど、Lispは相当単純にソースコードが解析できる
具体的に言うと
function f(a){
}
ってあると、まずfunctionって記述があるので次のfは関数名、aはその引数だってなるのだけど、とにかくそれが大変
対するLispはそれがない、functionって記述があるから次の単語の意味が変わるとかなくて、とにかくリストの一つ目がfunction-name、二つ目以降が引数っていうルールに一貫性があるのでパースしやすい、とにかく簡単
だからEmacsの設定にも利用されているように、そういったものには非常に利用しやすい
多分、完全に想像なんですけど、Emacsの設定ファイルってLispなんだけど、これをC言語かなんかに変換するような仕組みがあるんじゃないかなと思うんだよね
簡易のLispでそれなりの動作ができるようなものを用意しておいて、それを利用してエディタに柔軟さを持たせるわけでさ
例えばなのだけど、Apacheとかでの設定ファイルとか.htaccessとかそういうのにも使いやすいと思うんだよね、Lispの文法っていうやつは
そんでさらになんでこんなことになっているかと言うことなのだけど、読み込むのが簡単と言うことを目指したわけじゃなくて、生成が楽なことを目指したんじゃないかなと
想像してほしいのだけど、JavaScriptのソースコードを記述するプログラムを書くことがどれほど大変なことかと
逆にこれだけ単純にLispのソースコードを生成するプログラムって簡単に書けそうじゃない
マクロも特殊オペレーターもソースコード上ではまったく区別しないって言うのはソースコードを生成することが簡単になるからなわけで