【问题标题】:Load functions from file into REPL - Continuable Error将函数从文件加载到 REPL - 持续错误
【发布时间】:2019-12-18 15:20:45
【问题描述】:

到目前为止,在我的 Lisp 冒险中,我只是将在代码编辑器中编写的函数粘贴到 REPL 中以运行它们,但我现在有一个足够大的程序来构建它,它可以方便地使用 @ 987654321@ 是我工作流程中的第一次。

我必须开始使用包和/或命名空间来实现这一点吗?

我发现当我使用load时,如上所述,我得到了

** - Continuable Error
DEFUN/DEFMACRO(CLASS): #<PACKAGE CLOS> is locked
If you continue (by typing 'continue'): Ignore the lock and proceed
The following restarts are also available:
SKIP           :R1      skip (DEFMACRO CLASS # ...)
RETRY          :R2      retry (DEFMACRO CLASS # ...)
STOP           :R3      stop loading file /Users/m/cl/ansi-cl/ch17-objects/177d-new-full.lisp
ABORT          :R4      Abort main loop

我的.lisp 文件包含一个名为class 的宏,所以我理解错误。

问题是,当我将文件的内容直接粘贴到 REPL 中时,我没有收到此类错误。

导致行为差异的原因是什么? 是包、命名空间还是其他东西?

我确实可以只输入continue,文件就会加载,但我想了解这里发生了什么;这个“持续错误”的原因是什么,如果有的话我应该如何处理?

【问题讨论】:

    标签: common-lisp read-eval-print-loop clisp


    【解决方案1】:

    CLISP 中的包锁定在 the manual 中进行了说明。

    符号class 是一个ANSI CL 符号,因此它不能命名任何用户定义的实体,因此您的程序不符合,如11.1.2.1.2 Constraints on the COMMON-LISP Package for Conforming Programs 中所述。 你应该重命名你的宏。

    REPL 中缺少的错误是a bug in homebrew clisp。 与 ubuntu 一起分发的 CLISP 可以正常工作。 当我在 Mac 上从源代码构建 CLISP 时,它也可以正常工作。

    【讨论】:

    • 在 CLISP REPL 中重新启动它时,我可以输入(defun class () 42),它被接受而没有任何警告。或者只是(class) -> undefined function(symbol-function #'class) -> undefined function。当您说错误时,您的意思是有错误吗?
    • 我认为(defun class ...) 的正确行为是在文件加载/编译和 REPL 中都发出错误信号。在 IMO 中,REPL 中没有错误是一个错误。
    • 那么我们如何解释(symbol-function #'class) 提供undefined function 的新REPL 呢?这是否意味着它不需要发出错误信号,因为没有要覆盖的内容?
    • 请仔细阅读11.1.2.1.2。是的,没有函数class,但是无论如何用户是不允许定义这样的函数的。
    • 重点不是你可能会覆盖实现定义的函数/宏/符号宏定义。关键是如果两个包做你做的事情,即将class定义为function/macro/symbol-macro,这两个定义会发生冲突。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多