使用 "in-package" 时参数类型应该是什么?

What should be the argument type when using "in-package"?

我定义了一个包:(defpackage my-package (:use cl) (:export my-function))。当对该包使用 in-package 时,给 in-package 的参数类型应该是什么?

Common Lisp HyperSpec 说:

in-package name => package

Arguments and Values:

name---a string designator; not evaluated.

package---the package named by name.

我尝试了以下方法:

以上所有内容似乎都有效。以上有什么区别?我应该使用以上哪个?

此外,我注意到了这一点:

为什么使用关键字或 uninterned 符号是正确的,而不是符号?

in-package 的参数应该是一个 string designator,它是一个字符、符号或字符串。

在你的例子中:

  • my-package是符号

  • :my-package为关键字(自动内嵌导出,

  • #:my-package 是一个 uninterned symbol

  • "MY-PACKAGE" 是一个字符串

这些都是字符串指示符,但是表达式'my-package 不是字符串指示符(它不是符号);对于表达式 (quote my-package),它是 shorthand。表达式 (quote my-package) 确实 评估 一个符号,但是......回想一下 in-package 的文档(在上面发布的问题中引用)规定它的论点是未评估。这是因为 in-package 是一个宏。对于所有有效的版本,一个符号(或字符串)被传递给宏,但是对于 'my-package 未评估的形式 (quote my-package) 被传递。这解释了上面显示的错误消息:

; compiling (IN-PACKAGE (QUOTE MY-PACKAGE))
; file: /path/to/my-program.lisp
; in: IN-PACKAGE 'MY-PACKAGE
; (IN-PACKAGE 'MY-PACKAGE)
;
; caught ERROR:
; (during macroexpansion of (IN-PACKAGE 'MY-PACKAGE))
; 'MY-PACKAGE is not a string designator

请注意,默认情况下,Lisp reader 会将符号名称大写,但字符串区分大小写,用作字符串指示符时必须适当地大小写。