【问题标题】:Common Lisp appending package name to quoted keys in macrosCommon Lisp 将包名称附加到宏中的引用键
【发布时间】:2018-09-11 05:40:36
【问题描述】:

我注意到 Common Lisp 中的以下行为(至少使用 SBCL),我能够将其简化为以下行为:

假设我有以下宏:

(defpackage "MY-TEST"
  (:use "COMMON-LISP")
  (:export :appended
       :not-appended))

(in-package :MY-TEST)

(defmacro not-appended ()
  `(list ':type 'array))

(defmacro appended ()
  `(list ':type 'something-else))

以下是输出:

* (my-test:not-appended) 
(:TYPE ARRAY)


* (my-test:appended) 
(:TYPE MY-TEST::SOMETHING-ELSE)

请注意,在第二个宏中,命名空间位于“SOMETHING-ELSE”之前。

问题:

  • 为什么它们不一样?老实说,我期待“未附加”宏的行为。是因为 Common Lisp 以某种方式知道“数组”吗?
  • 如果是,那么我在哪里可以找到其他已知的关键字?

【问题讨论】:

  • 在您导入的COMMON-LISP-package 中有一个名为ARRAY 的符号。您可以使用(apropos "" :cl) 查看包中的所有符号。
  • @jkiiski,谢谢。现在说得通了。

标签: package common-lisp symbols


【解决方案1】:

请注意,这与宏完全无关,是包、符号和符号打印方式的影响:

“MY-TEST”包:

CL-USER 2 > (defpackage "MY-TEST"
              (:use "COMMON-LISP")
              (:export :appended
               :not-appended))
#<The MY-TEST package, 0/16 internal, 2/16 external>

通过调用in-package使包成为当前包:

CL-USER 3 > (in-package :MY-TEST)
#<The MY-TEST package, 0/16 internal, 2/16 external>

让我们计算符号arrayfoo 的列表。看看 REPL 如何将它打印为 (ARRAY FOO),因为这两个符号都可以在包 MY-TEST 中访问。

MY-TEST 4 > (list 'array 'foo)
(ARRAY FOO)

CL-USER 设为当前包:

MY-TEST 5 > (in-package :cl-user)
#<The COMMON-LISP-USER package, 151/256 internal, 0/4 external>

现在让我们获取倒数第二个值,看看 REPL 是如何打印它的:

CL-USER 6 > **
(ARRAY MY-TEST::FOO)

ARRAY 打印时没有包前缀,因为它与包COMMON-LISP 中的符号相同(在包MY-TEST 中使用)。 FOO 印有包前缀MY-TEST,因为它是该包中的一个内部符号 - 它被留在那里,因为当时当前的包是MY-TEST。有两个冒号,因为符号FOO不是从包MY-TEST导出的,也不是导入包CL-USER的。

“CL”和“CL-USER”包包含来自编程语言 Common Lisp 的所有符号 - 因此,将“CL”导入您自己的包中可以使该包中的所有这些符号也可用。

CL-USER 7 > (let ((l '()))
              (do-symbols (sym (find-package "CL") l)
                (pushnew sym l)))
(MAKE-ARRAY INVOKE-DEBUGGER STRING-TRIM WILD-PATHNAME-P UNREAD-CHAR RESTART-BIND ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    相关资源
    最近更新 更多