当打印出被包装在一个包装中但从另一个包装中引用的对象名称时,打印名称将包括完整的包装名称。例如,以下交互在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)
有时出于诊断/调试的原因,我想打印出不带包前缀的外部符号。在这种情况下,打印输出将看起来像(A B C)。对于您知道名称含义的复杂对象或嵌套对象,包前缀可以使打印输出难以阅读,尤其是在有多个包的情况下。可以暂时取消显示前缀吗?
答案 0 :(得分:3)
否,但是您可以通过暂时将*package*
绑定到一个软件包以打印输出来取消其前缀。
示例:
(let ((*package* (find-package :pkg1)))
(print pkg1:*x*))
由于*package*
是全局动态,因此,这会影响此let
形式的内部调用(即,在调用的动态范围内),而不会影响外部的任何内容。