Shammer's Philosophy

My private adversaria

loadするファイルで呼出可能な関数スコープ

一つのアプリケーションをインフラ部分と、その上で実行される不特定な処理とで分けたい。言ってみればミドルウェアっぽいことをしたい、というときに、不特定な処理で実行可能な、ミドルウェアで定義されたfunctionを呼出しできるかを確認したい。手始めに、以下のようにやってみた。ファイル名はload-test-01.lispだ。

(labels ((hello (name)
	   (format t "Hello, ~A!~%" name)))
  (load "aaaaa.lisp"))
(quit)

このaaaaa.lispの中から、helloを呼出しできるか。

$ cat aaaaa.lisp 
(hello "Taro")
$ ccl64 -l load-test-01.lisp 
> Error: Undefined function HELLO called with arguments ("Taro") .
> While executing: (:INTERNAL CCL::WITH-COMPILATION-UNIT-BODY CCL::LOAD-FROM-STREAM), in process listener(1).
> Type :GO to continue, :POP to abort, :R for a list of available restarts.
> If continued: Retry applying HELLO to ("Taro").
> Type :? for other options.
1 > (quit)
$ 

これはできないようだ。labelsだからだろうか。以下のようにdefunで定義しなおす。

(defun hello (name)
  (format t "Hello, ~A!~%" name))
(load "aaaaa.lisp")
(quit)

これを実行すると以下のようになる。

$ ccl64 -l load-test-01.lisp 
Hello, Taro!
$ 

こっちは問題ない。ミドルウェアのようなものを作成するには、起動のタイミングとかでユーザーの独自の処理ファイルをロードして、それを後で呼出すようにする必要がある、ということだ。そうなるとまた、、、パッケージの話とかになりそうだ。いつかやったな、、、パッケージ。業務に追われてLispをいじるのはご無沙汰になりがちですぐに忘れてしまう。もっと日常的に利用していかないと。もしかしたら、今日やったことも昔どこかでやっていたのかもしれない。