Shammer's Philosophy

My private adversaria

defpackage の :use は common-lisp-user だけではダメだった

defpackage の :use を使う - Shammerismで :use に common-lisp-user を渡せばいい、と書いたが、これだけでは不足だった。これだけだと in-package した後で関数を定義することすらできない。

? (defpackage "TEST" (:use common-lisp-user))
#<Package "TEST">
? (in-package test)
#<Package "TEST">
? (defun say-hello () (format t "Hello~%"))
> Error: Unbound variable: SAY-HELLO
> While executing: CCL::CHEAP-EVAL-IN-ENVIRONMENT, in process listener(1).
> Type :GO to continue, :POP to abort, :R for a list of available restarts.
> If continued: Retry getting the value of SAY-HELLO.
> Type :? for other options.
1 > q
? (defun test () t)
> Error: Unbound variable: TEST
> While executing: CCL::CHEAP-EVAL-IN-ENVIRONMENT, in process listener(1).
> Type :GO to continue, :POP to abort, :R for a list of available restarts.
> If continued: Retry getting the value of TEST.
> Type :? for other options.
1 > q
?

common-lisp-user だけでなく、common-lisp も必要だ。また、その他にも common-lisp-user で :use 扱いになっているパッケージがあればそれも必要かも。とりあえず、ClozureCL の場合は CCL も入れておくのがよさそうだ。

? (defpackage "TEST" (:use "COMMON-LISP-USER" "COMMON-LISP"))
#<Package "TEST">
? (in-package test)
#<Package "TEST">
? (defun test () t)    
TEST
? (quit)
> Error: Undefined function QUIT called with arguments () .
> While executing: CCL::TOPLEVEL-EVAL, in process listener(1).
> Type :GO to continue, :POP to abort, :R for a list of available restarts.
> If continued: Retry applying QUIT to NIL.
> Type :? for other options.
1 > q
? *package*
#<Package "TEST">
? (ccl::quit)
$

CCL も :use に含めると以下のようになる。

? (defpackage "TEST" (:use "COMMON-LISP" "CCL" "COMMON-LISP-USER"))
#<Package "TEST">
? (in-package test)
#<Package "TEST">
? (defun say-hello () (format t "Hello~%"))
SAY-HELLO
? (say-hello)
Hello
NIL
? (quit)
$

パッケージのリストは、(list-all-packages) で取得できる。