パッケージ名をキーワードで書く理由

一言で言うと: 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 と行ったり来たりするんでなければ文字列で問題無かった。