LISPは実はあんまり難しくないんじゃないか。まあ個人の感想でね?
嘘だ。
これは『実践 Common LISP』読んだ上でのわかりづらかったポイントの個人的なメモ
- 括弧
- 再帰
- シンボル
括弧
どうせエディタが対応とってくれる。
嘘だっ!
括弧だらけだと言われるのは、条件分岐も繰り返しも配列も連想配列もパッケージ定義もクラス定義もメソッド定義もみんなリストの形をしたコードで、違いがわからないからだろうと思う。それらが見た目に目立って異なるシンタックスで表現される言語だと、コードのパターンが見つけやすく、それを取っ掛かりに全体像を把握できる気がするけど、LISPはどこを切り取ってもリスト、リスト、リストで取っ掛かりがない。
まあ、それがLISPの強みではあるのだけれど。
基本的な制御構造やデータ構造で、LISPにあるものはRubyにもだいたいある。当たり前といえば当たり前。わかってみればそこはごく普通の言語なのだった。まる。
再帰
慣れの問題が半分くらい、何を書きたいかちゃんと理解してるかが半分くらいあると思った。未熟なのでしょうがない。熟してくると慣れの比率が上がるのだろう。
ついついループで考えてしまうのを抑制するのは難しい。でもループに必ず再帰が必要なわけではなく、do系もloopマクロもある。また、再帰的でないようなコードを書いても別に誰にも怒られはしない。そういうわけだから、これから毎日setfしようぜ?
traceを使うと関数の呼び出され方が見えるようになるらしい。これで再帰呼び出しの様子が見られるよ! やったねたえちゃん!
シンボル
LISPは、そのコードがデータと同じ方法で記述される。
それを、はじめのうちは、『LISPの構文とリストの構文に類似性がある』とか、『S式はLISPのプログラムともリストとも評価される』みたいに、LISPプログラムとリストを切り分けるような考え方をしていたんだけど、どうもそういう考え方をしているとわけがわからなくなる。シンボルが変数として扱われたり、そうじゃなかったりすることで混乱して、頭がおかしくなって死ぬ。
LISPのプログラムは単なるリストでしかない。Rubyで例えると、
[ :format, :t, "Hello World!" ]
みたいに書かれているのと変わらない。 :format は変数じゃなくてただのオブジェクトで、属性として名前なんかを持っている。それが、評価器に入れられた時にたまたま変数とか関数名として振る舞うことになるってだけ。そう考えると、シンボルが評価されたりされなかったりするスペシャルフォームとかマクロとかで混乱しない。と思う。
たぶん。この解釈であってるのか、自信はない。