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) で取得できる。