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関数で呼びだされているのが重要なんじゃないかな。