禁止使用符号软件包前缀(通用Lisp)

时间:2019-05-11 04:16:20

标签: package common-lisp symbols

当打印出被包装在一个包装中但从另一个包装中引用的对象名称时,打印名称将包括完整的包装名称。例如,以下交互在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)。对于您知道名称含义的复杂对象或嵌套对象,包前缀可以使打印输出难以阅读,尤其是在有多个包的情况下。可以暂时取消显示前缀吗?

1 个答案:

答案 0 :(得分:3)

否,但是您可以通过暂时将*package*绑定到一个软件包以打印输出来取消其前缀。

示例:

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

由于*package*全局动态,因此,这会影响此let形式的内部调用(即,在调用的动态范围内),而不会影响外部的任何内容。