Package 名は大文字がよさそう
Package の定義はややこしい。以下のようにやってみたが、
- Launch ClozureCL
- (defpackage "my-package" (:use common-lisp-user) (:export "hello"))
- (in-package my-package)
- (defun hello () (format t "Hello!~%"))
以下のメッセージが。。。
> Error: Unbound variable: 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 HELLO. > Type :? for other options.
なぜに hello を定義できないのか・・・さらに、この状態で (quit) をやっても終了できない。(common-lisp-user::quit) とやらないといけなかった。:use で common-lisp-user の Package は使用できるようになるんじゃないのか?
もう一度 ClozureCL を起動し、今度は (defpackage "my-package") とだけやった。今度は hello を定義できた。
(defun hello () (format t "Hello!~%"))
そこで、これを common-lisp-user の Package から実行してみようと (in-package "common-lisp-user") を実行したが、以下のエラーに遭遇。
> Error: There is no package named "common-lisp-user" . > While executing: CCL::SET-PACKAGE, in process listener(1). > Type :GO to continue, :POP to abort, :R for a list of available restarts. > If continued: Retry finding package with name "common-lisp-user". > Type :? for other options.
代わりに (in-package common-lisp-user) で戻ることができた。
? (in-package common-lisp-user) #<Package "COMMON-LISP-USER"> ?
自分で定義した Package に切り替えるときにはダブルクォーテーションで囲ったが、オリジナルの Package に戻るときには何もいらないのか?ちょっと確認。
? (package-name *package*) "COMMON-LISP-USER" ? (in-package "my-package") #<Package "my-package"> ? (package-name *package*) "my-package" ?
自分で定義したパッケージは大文字でなく小文字になっている。この違いか。大文字で定義すれば・・・
? (defpackage "MY-PACKAGE") #<Package "MY-PACKAGE"> ? (in-package my-package) #<Package "MY-PACKAGE"> ?
同じようになった。Package は全て大文字で定義するのがよさそうだ。あるいは、文字列じゃなくてもいいのかも。
? (defpackage aaa) #<Package "AAA"> ?
defpackage の :use がよくわからない。自分の思っている動作と違うようだ。今度はこれをもう少し見てみたい。