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

Flu*_*lux 2 common-lisp

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

\n

Common Lisp HyperSpec说:

\n
\n

包内名称 => 包

\n

论点和价值观:

\n

name——字符串指示符;未评价。

\n

package---以名称命名的包。

\n
\n

我已经尝试过以下方法:

\n
    \n
  • (in-package my-package)\xe2\x80\x94 \xe2\x9c\x93
  • \n
  • (in-package :my-package)\xe2\x80\x94 \xe2\x9c\x93
  • \n
  • (in-package #:my-package)\xe2\x80\x94 \xe2\x9c\x93
  • \n
  • (in-package "MY-PACKAGE")\xe2\x80\x94 \xe2\x9c\x93
  • \n
\n

上述所有内容似乎都是有效的。上面的有什么区别呢?我应该使用以上哪一个?

\n

另外,我注意到这一点:

\n
    \n
  • (in-package \'my-package)\xe2\x80\x94 \xe2\x9c\x97

    \n

    SBCL 中的错误:

    \n
    ; compiling file "/path/to/my-program.lisp" (written 12 MAR 2021 01:23:45 AM):\n; compiling (IN-PACKAGE (QUOTE MY-PACKAGE))\n; file: /path/to/my-program.lisp\n; in: IN-PACKAGE \'MY-PACKAGE\n;     (IN-PACKAGE \'MY-PACKAGE)\n; \n; caught ERROR:\n;   (during macroexpansion of (IN-PACKAGE \'MY-PACKAGE))\n;   \'MY-PACKAGE is not a string designator\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
\n

为什么使用关键字或未驻留符号是正确的,但使用符号却不正确?

\n

ex *_*ilo 5

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

在你的例子中:

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

; 编译 (IN-PACKAGE (QUOTE MY-PACKAGE))
; 文件:/path/to/my-program.lisp
;在:包内“我的包”
;(包内“我的包”)

; 发现错误:
;(在 (IN-PACKAGE 'MY-PACKAGE) 宏扩展期间)
;'MY-PACKAGE 不是字符串指示符

请注意,默认情况下,Lisp 阅读器会将符号名称大写,但字符串区分大小写,并且在用作字符串指示符时必须正确区分大小写。