Подавление префиксов пакета символов (Common Lisp) - PullRequest
1 голос
/ 11 мая 2019

При печати имен объектов, которые находятся в одном пакете, но на которые ссылаются из другого пакета, имя печати будет включать полное имя пакета.Например, следующее взаимодействие интернирует символ X в PKG1 и печатает его значение из 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)

Иногда по причинам диагностики / отладки я хотел бы распечатать внешние символы без префиксов их пакетов.В этом случае распечатка будет выглядеть как (ABC).Для сложных или вложенных объектов, где вы знаете, что означают имена, префиксы пакетов могут затруднить чтение распечатки, особенно если имеется несколько пакетов.Можно ли временно отключить префиксы для распечатки?

1 Ответ

3 голосов
/ 11 мая 2019

Нет, но вы можете удалить префиксы одного пакета, временно привязав *package* к нему для распечатки.

Пример:

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

Так как *package* равно глобально динамический , это влияет на все, что вызывается внутри (то есть в динамическом экстенте его вызова) этой формы let, но не влияет на что-либо снаружи.

...