我定义了一个包:(defpackage my-package (:use cl) (:export my-function)). 当用于in-package该包时,给出的参数类型应该是什么in-package?
Common Lisp HyperSpec说:
\n\n\n包内名称 => 包
\n论点和价值观:
\nname——字符串指示符;未评价。
\npackage---以名称命名的包。
\n
我已经尝试过以下方法:
\n(in-package my-package)\xe2\x80\x94 \xe2\x9c\x93(in-package :my-package)\xe2\x80\x94 \xe2\x9c\x93(in-package #:my-package)\xe2\x80\x94 \xe2\x9c\x93(in-package "MY-PACKAGE")\xe2\x80\x94 \xe2\x9c\x93上述所有内容似乎都是有效的。上面的有什么区别呢?我应该使用以上哪一个?
\n另外,我注意到这一点:
\n(in-package \'my-package)\xe2\x80\x94 \xe2\x9c\x97
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\nRun Code Online (Sandbox Code Playgroud)\n为什么使用关键字或未驻留符号是正确的,但使用符号却不正确?
\n的参数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 阅读器会将符号名称大写,但字符串区分大小写,并且在用作字符串指示符时必须正确区分大小写。