なんだこれは

はてなダイアリーから移転しました。

Clozure CLで僕が誤解していたこと

Emacs で test2.lisp にこんな関数を書いてみる

(defun hello-world ()
   (format t "hello lisp world"))

それから slime 起動して、C-cC-k してから slime 側で

(ccl:save-application "test.o" :toplevel-function #'hello-world
			       :prepend-kernel t)

こうしたら、test.oという実行ファイルができる。これはわかる。

次に slime 側で なにか lispのファイルを読んでみる。そうだ、正規表現にしよう。

(load "~/somewhere/pregexp.lisp")

それから、前の関数を書きかえて、C-cC-kしてもういちど slime側に送ってみる。

(defun hello-world ()
  (format t (car (pregexp-match "hello" "hello lisp world"))))

それからもういっかいslime側で

(ccl:save-application "test.o" :toplevel-function #'hello-world
			       :prepend-kernel t)

してみると、また実行ファイルが作成できてしまう。slime側で確かにpregexpを読みこんだんだから、これでいいといえばいいはずなんだけれども、どうもしっくりこなかった。

そう、たとえばC言語のように考えてしまっていた。ヘッダファイル読んでないのに、別の書いていない pregexp-match が使えてしまうけど、いいのかなぁって。
でもこれはたぶん誤解だ。

ccl:save-applicationで指定しているのは、hello-world 関数であって、ファイルではないのだった。むしろ、ファイルはおまけで、replで評価しているのが、toplevel関数で呼びだされているのが重要なんじゃないかな。