gpt4 book ai didi

common-lisp - CL 实现之间的包系统有何不同?

转载 作者:行者123 更新时间:2023-12-01 08:49:11 28 4
gpt4 key购买 nike

使用时 (make-package 'test) (in-package test)在 SBCL 和 CCL 实现中,我注意到 SBCL 需要 (cl:defun foo () (...))(cl:describe <symbol name here>)而 CCL 不需要任何冒号或双冒号来使用内置符号。我的理解是外部符号必须用一个冒号访问,即使它们是内置的。然而,CCL 在这方面的工作方式似乎有所不同。

这让我对外部符号的使用有些困惑。外部符号是否应该在没有任何冒号的情况下可用,还是 CCL 只是为了方便起见而自动使用/导入/继承?

此外,关于符号和包的实现之间是否还有更多这些微小但显着的差异?

最佳答案

ANSI CL 标准没有定义创建包时使用哪些包

在某个时间点,SBCL 偏离了惯例,但仍遵循 ANSI CL 标准。

使用包

在其他包中使用包意味着在该包中提供它们的符号。

您可以通过调用函数 package-use-list 来获取包的使用列表。 .

它在 ANSI Common Lisp 标准中未定义,该标准默认情况下打包新包使用以及是否使用任何包。

实现中的不同常见做法

现在在实现中有两种常见的做法:

  • 使用 COMMON-LISP 和一些特定于实现的包。 CCL 就是这样做的。

  • CCL 中的示例:
    ? (package-use-list (make-package "FOOBAR"))
    (#<Package "CCL"> #<Package "COMMON-LISP">)

    LispWorks:
    CL-USER 17 > (package-use-list (make-package "FOOBAR"))
    (#<The COMMON-LISP package, 0/4 internal, 978/1024 external>
    #<The HARLEQUIN-COMMON-LISP package, 0/4 internal, 365/512 external>
    #<The LISPWORKS package, 0/4 internal, 226/256 external>)
  • 不使用包。 SBCL 就是这样做的。如果您希望新包使用 COMMON-LISP 包,则必须明确请求。

  • SBCL 中的示例:
    * (package-use-list (make-package "FOOBAR"))

    NIL

    ABCL:
    CL-USER(1): (package-use-list (make-package "FOOBAR"))
    NIL

    编写可移植代码

    因此,在 SBCL 以及可移植的 Common Lisp 中,您需要告诉 Lisp 应该使用哪些包。获取 COMMON-LISP使用的包,只有那个包,你需要写:
    (make-package "FOO" :use '("COMMON-LISP"))

    背景

    第一个 Common Lisp 的最初想法是可以写 (in-package "FOO")在 REPL 中,该包是使用合理的默认值创建的,并且一个直接在该包中。默认值通常是语言包(当时称为“LISP”)和通用扩展包(例如 CLOS+MOP、线程等)。

    后来 Common Lisp 被更改,因此 IN-PACKAGE 不创建包,并且定义了在创建包时未定义使用哪些包,并且在创建包时不需要使用任何包。 SBCL 维护者随后认为:与其支​​持通用实践(标准中未提及),不如提供一种更中立和可预测的行为,即在创建包时不使用包。

    其他差异

    Common Lisp 中包系统的大多数其他差异都围绕标准的扩展。例子:
  • 分层/嵌套包
  • 整个表单的包前缀(不仅仅是符号)

  • 某些实现提供的更大且不兼容的更改作为选项:
  • 所有现有符号的小写和小写阅读器。默认情况下,标准将符号定义为内部大写。

  • 不明确的:
  • 对其他未引用但被保留的符号进行垃圾回收
  • 关于common-lisp - CL 实现之间的包系统有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47194093/

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