抑制符号包前缀(Common Lisp)

Suppressing Symbol Package Prefixes (Common Lisp)

当打印出驻留在一个包中但从另一个包中引用的对象名称时,打印名称将包括完整的包名称。例如,以下交互在 PKG1 中实习符号 X,并从 CL-USER 打印它的值:

* *package*
#<PACKAGE "COMMON-LISP-USER">

* (defpackage :pkg1 (:use :cl))
#<PACKAGE "PKG1">

* (in-package :pkg1)
#<PACKAGE "PKG1">

* (defvar x '(a b c))
X

* (in-package :cl-user)
#<PACKAGE "COMMON-LISP-USER">

* pkg1::x
(PKG1::A PKG1::B PKG1::C)

有时出于 diagnostic/debugging 的原因,我想打印出没有包前缀的外部符号。在这种情况下,打印输出将类似于 (A B C)。对于您知道名称含义的复杂或嵌套对象,包前缀会使打印输出难以阅读,尤其是在有多个包的情况下。打印输出时可以暂时抑制前缀吗?

不,但是您可以通过临时绑定 *package* 来省略一个包的前缀以供打印输出。

示例:

(let ((*package* (find-package :pkg1)))
  (print pkg1:*x*))

由于 *package* 全局动态的 ,这会影响内部调用的所有内容(即在其调用的动态范围内)此 let 形式但不会不会影响外面的任何东西。