言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

Allegro Common Lisp チュートリアルで遊ぶ

全部6章のうち、5章の終わりで壊れてしまって進めない!めっちゃ悔しい。

何でも新たに発明するという事は難しい物で、イアンさんが頑張って作っている fonc も、やっぱり段々 Lisp になって来ている。と書くとあたかも僕が物知りで、最初から何でも分かっていたものいいだが、このパソコンには何年も前から Lisp が入っているにも関わらず、毎日 fonc で開発するようになるまでは全くその価値が分かっていなかった。だから僕は fonc を通してやっと Lisp に興味を持てた事になる。

特にここでは開発環境に注目したい。Lisp はその特異な文法や、マクロのような言語機能が目立つけど、イメージというのも特徴的だ。イメージというのはある時点でのメモリをファイルとして保存した物で、典型的な Lisp、そして Smalltalk 環境では、起動の度にライブラリを読み込む代わりにあらかじめライブラリを読み込んで作ったイメージを読む。

機能としてはただのライブラリのキャッシュなので、java でも何でも同じ事をやろうと思えば出来るはずだ。そしてちっとも本質的な物では無い。むしろイメージは巨大なバイナリなので、時にメンテナンス性を下げる諸刃の剣だ。しかし Lisp と言い Smalltalk と言い、ダイナミックな開発環境を提供する処理系がイメージを捨てられず、Java .NET が未だにギコチナイ環境しか作れない事を考えると意外と本質的なのではと思えてくる。

話が滅茶苦茶それる所だった。

Smalltalk の弱点はイメージに頼りすぎる事で、イアンの奴は逆にイメージを使わずソースコードだけで生きている。この先を考えるとソースコードとイメージの共存をまともにやっている Lisp に似てくるのは必至なので、ちゃんとした Common Lisp の処理系を学ぼうと思ってチュートリアルをやっていた所、途中で詰まってしまった。基本的な概念が分かっていない物だからどこが壊れたのか、どこを直せばよいのか全然分からず悔しい。

突然だけど、今まで分かった Common Lisp の面白い点を書く。

仕様にデバッグ用の関数が規定されている。例えば (describe 'describe) とか (inspect 'inspect) とかでシンボルの内容を調べる事が出来る。

任意のオブジェクトの集合をタイプと呼ぶ。タイプはクラスでも基本型でも、適当に選んだオブジェクトでも、集合なら何でも良い。メソッドはタイプを元に分岐するので、パターンマッチとして使える。例えば factorial はこうなる。

(defmethod fact ((x (eql 0))) 1)
(defmethod fact ((x number)) (* x (fact (- x 1))))

何故か Allegro Common Lisp の開発環境がぶっ壊れた時は、ホームディレクトリの設定ファイル allegro-prefs-8-1-express.cl を消せば直る。

また何か分かったら書きます。