【问题标题】:What should be the argument type when using "in-package"?使用“in-package”时的参数类型应该是什么?
【发布时间】:2021-09-18 23:25:25
【问题描述】:

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

Common Lisp HyperSpec 说:

包内名称 => 包

参数和值:

name---一个字符串指示符;未评估。

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

我尝试了以下方法:

  • (in-package my-package) — ✓
  • (in-package :my-package) — ✓
  • (in-package #:my-package) — ✓
  • (in-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
    

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

【问题讨论】:

    标签: common-lisp


    【解决方案1】:

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

    在你的例子中:

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

    ;编译 (IN-PACKAGE (QUOTE MY-PACKAGE))
    ;文件:/path/to/my-program.lisp
    ;在:IN-PACKAGE '我的包
    ; (包装内“我的包装”)
    ;
    ;捕获错误:
    ; (在 (IN-PACKAGE 'MY-PACKAGE) 的宏展开期间)
    ; 'MY-PACKAGE 不是字符串指示符

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

    【讨论】:

    • 我应该使用哪个?根据我的理解,我应该更喜欢 uninterned 符号,因为它不会污染当前或关键字命名空间(就像使用符号或关键字时一样)。
    • 任你选。任何字符串指示符都可以;从那时起,我更喜欢关键字或非内部符号而不是字符串,我不必担心大小写。使用 uninterned 符号比使用普通关键字有一点好处,但我通常还是会使用它们。
    猜你喜欢
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 2021-11-25
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多