gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:59:10 24 4
gpt4 key购买 nike

我定义了一个包:(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.

我尝试过以下方法:

  • (包内 my-package) — ✓
  • (包内:my-package) — ✓
  • (包内#:my-package) — ✓
  • (包内“MY-PACKAGE”) — ✓

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

此外,我注意到这一点:

  • (in-package 'my-package) — ✗

    SBCL 错误:

    ; compiling file "/path/to/my-program.lisp" (written 12 MAR 2021 01:23:45 AM):
    ; 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

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

最佳答案

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

在您的示例中:

所有这些都是字符串指示符,但表达式'my-package不是字符串指示符(它不是符号);它是表达式 (quote my-package) 的简写。表达式 (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 阅读器会将符号名称大写,但字符串区分大小写,并且在用作字符串指示符时必须正确大小写。

关于common-lisp - 使用 "in-package"时参数类型应该是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69239191/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com