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をいじるのはご無沙汰になりがちですぐに忘れてしまう。もっと日常的に利用していかないと。もしかしたら、今日やったことも昔どこかでやっていたのかもしれない。