« 実践Common Lispを読んでみる(その3) | メイン | あの日見た青を思い出して »

2008年10月 5日

実践Common Lispを読んでみる(その4)

さて、1週間ほどあいてしまいましたが相変わらずぼちぼち読み進めています。今日は9章までのまとめでも。

まずは変数の話。当然common lispにもローカル変数(レキシカル変数)というのがあるわけdすが、もしこのレキシカル変数を無名関数内で使ったらどうなるかというのがこのサンプル。

(defparameter *fn*
  (let ( (count 0)) #'(lambda () (setf count (1+ count)))))

defparameter(グローバル変数)の定義として、無名関数を使用してますが、この初期化はいつ行われ、いつ行われないのか。答えは、次の結果を見てから。

CL-USER> (funcall *fn*)
1
CL-USER> (funcall *fn*)
2
CL-USER> (funcall *fn*)
3

つまり、count = 0となるのは最初の1回かぎりであとはcount++が延々と呼び出されます。これがクロージャによる束縛という機能、らしいです。一度letによってcountを束縛すると、次にletを呼び出したとしてもその束縛が延々と続いているので初期化のルーチンは実行されない、ということです。

次はdefvarとdefparameterの違い。どっちもグローバル変数の宣言時に使用しますが、違いはdefparameterは呼び出すたびに初期化され、defvarは最初しか初期化されないこと。なのでdefvarで宣言した変数を初期化する場合はsetfとか使わなければならないということです。setfは変数を代入する際に使用するメソッドです。

続いてマクロ。lispでいうマクロとは、コードを生成するコードのことで、その生成されたコードを別のコードが実行するのが一連の流れですが、このあたりは分かっていても慣れないと難しいです。9章とか読んでもまだわかんないですが、とりあえず先に進みたいと思います。

あと個人的なメモ。
  • シングルクオート(shift+7)、シングルクオートの次に書いている変数は評価されない
  • バッククオート(shift+@)、バッククオートの次に書かれている式全体が評価されない
  • コンマ、バッククオート内の式の内、評価されたい変数は前にコンマを書く

うーん、覚えられない・・・。

追記、現在common lisp+SDLの環境をいろいろ調べています。またある程度わかり次第wikiにでもまとめます。現状としてはwindowsバイナリまでなら作成可能です(CLISPで、ですが)。でも一番の鬼門はwindows上でまともなLISP処理系がないことですが・・。

投稿者 mak : 2008年10月 5日 01:40

トラックバック

このエントリーのトラックバックURL:
http://sorakaze.net/cgi-bin/blog/mt-tb.cgi/141

コメント

コメントする