Shammer's Philosophy

My private adversaria

Package 名は大文字がよさそう

Package の定義はややこしい。以下のようにやってみたが、

  1. Launch ClozureCL
  2. (defpackage "my-package" (:use common-lisp-user) (:export "hello"))
  3. (in-package my-package)
  4. (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 がよくわからない。自分の思っている動作と違うようだ。今度はこれをもう少し見てみたい。