パッケージ名をキーワードで書く理由
一言で言うと: xyzzy でも CL でも同じように書けるから
文字列で書くと...
xyzzy でも CL でも文字列は大文字/小文字の変換などされないので、小文字はそのまま扱われる。defpackage でパッケージ名を文字列で書くと、パッケージ名に小文字を含んだパッケージが定義される。
これが CL では実質的に使い物にならない。そのままではシンボル名に小文字を含めることができないので、文字列で指定するかエスケープする必要がある。
;; CCL (SLIME) にて CL-USER> (defpackage "foo" (:use :cl) (:export #:hello)) #<package: "foo"> CL-USER> (find-package 'foo) NIL CL-USER> (symbol-package 'foo:hello) ; Evaluation aborted on #<CCL::NO-SUCH-PACKAGE #x189B61E6> CL-USER> (symbol-package '|foo|:hello) #<package: "foo">
(キーワード以外の)シンボルで書くと...
xyzzy ではパッケージ名もシンボル名も小文字のままなので問題なし。
CL ではパッケージ名もシンボル名も大文字に変換されるので問題なし。
てなわけで xyzzy でも CL でも大文字/小文字の問題でパッケージが見つけられないってことにはならないんだけど、xyzzy の in-package が CL と違って引数を評価してしまうので、xyzzy ではクォートする必要がある。
;; xyzzy (xl-repl) にて user> :expand (in-package foo) (eval-when (:compile-toplevel :load-toplevel :execute) (lisp::in-package-1 foo))
lisp::in-package-1 は関数なので foo が評価される(setq とかしてなければエラーになる)
CL では評価されない。
Arguments and Values:
name---a string designator; not evaluated.
CLHS: Macro IN-PACKAGE
キーワードで書けば
シンボルと同じく大文字/小文字の問題もなく、in-package でも自分自身に評価されてちゃんと指定できる。
難点を言えば、defpackage がキーワードまみれになるので regexp-keyword-list で色付けてるのにちゃんと見ないと区別できない。
まとめ
CL と行ったり来たりするんでなければ文字列で問題無かった。