Shammer's Philosophy

My private adversaria

Lisp Package その1

ほぼすべての言語で使えるが、Lisp にもパッケージがある。要は、NameSpace だ。Clozure CL では、*package* 変数に現在のパッケージが格納されている。

? *package*
#<Package "COMMON-LISP-USER">
? 

デフォルトでは COMMON-LISP-USER パッケージのようだ。
自分専用のパッケージを定義するには、defpackage を使い、in-package で切り替える。

? (defpackage "package-sample")
#<Package "package-sample">
? (in-package "package-sample")
#<Package "package-sample">
? *package*
#<Package "package-sample">
? 

たとえば、切り替え後のパッケージでシンボル X を定義すると、他のパッケージでは X だけでは参照できない。上記コードに続いて以下のようにやってみる。

? (setf x (cons 'a 'b))
(A . B)
? x
(A . B)
? (in-package "COMMON-LISP-USER")
#<Package "COMMON-LISP-USER">
? x
> Error: Unbound variable: X
> 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 getting the value of X.
> Type :? for other options.
1 > 

X は package-sample 内で定義したから、デフォルトの COMMON-LISP-USER パッケージからは参照できない。これを外部から参照させるにはどうするかとかは今後やっていくことにする。