Lisp 这可能会永久且意外地覆盖编译器';它自己的功能?
所以我在编写自己的函数,并调用它Lisp 这可能会永久且意外地覆盖编译器';它自己的功能?,lisp,common-lisp,ccl,Lisp,Common Lisp,Ccl,所以我在编写自己的函数,并调用它makelist,我从调试器得到了以下结果: The function MAKE-LIST is predefined in Clozure CL. [Condition of type SIMPLE-ERROR] Restarts: 0: [CONTINUE] Replace the definition of MAKE-LIST. 很好,但是如果我不小心选择了选项0??我的编译器是否会像我替换它那样被破坏,并且永远具有错误的内部函数
makelist
,我从调试器得到了以下结果:
The function MAKE-LIST is predefined in Clozure CL.
[Condition of type SIMPLE-ERROR]
Restarts:
0: [CONTINUE] Replace the definition of MAKE-LIST.
很好,但是如果我不小心选择了选项
0
??我的编译器是否会像我替换它那样被破坏,并且永远具有错误的内部函数定义?只有当前运行的映像会被破坏,在这种情况下,您可以重新启动CCL来恢复它
造成永久性损坏的唯一方法是保存图像,并选择覆盖原始图像文件。许多Lisp系统本身都是用Lisp编写的 Clozure CL就是这样一个例子。ClozureCL是用ClozureCL编写的(带有一些C语言和汇编语言)。Clozure CL可以自行编译 因此,Clozure CL中许多/最常见的Lisp函数都是用Clozure CL编写的。因此,它需要某种类型的开关,允许定义或重新定义内置功能。因此,肯定有一种方法可以编辑实现的源代码并进行更改。最好您的定义是“正确的”,这样Lisp系统的功能就不会受到影响。请记住,重新定义通常不会对内联函数或已扩展的宏产生影响 现在,如果我们作为典型的程序员使用Clozure CL,一些包会受到保护,不允许重新定义符号,并发出错误信号。但您可以继续,然后更改内部函数。与许多常见的Lisp一样,它们对更改非常开放,但作为程序员,您有责任做正确的事情 如果更改Lisp内部函数,有几种方法可以留下永久性损坏:
- 保存图像并在以后使用
- 使用它来重新编译CCL本身或其部分
- 您可以编译一个文件,但生成的代码可能与原始编译器不同
- 您可以编译一个文件,生成的代码会以某种方式包含一个已更改的Lisp函数的内联版本
如果加载这样一个文件,它可能会自动通过某个init文件,它包含更改,更改后的代码将成为当前运行的Lisp的一部分。@menschenkelin:对不起,是的,我对导入的工作方式感到困惑,并在没有检查的情况下分享了我的错误假设。没错,导入的符号是原始符号,而不仅仅是它们的副本。这是有道理的,因为否则,例如重新绑定
*read eval*
将不起作用,您必须始终明确地重新绑定cl:*read eval*
;包中的重新绑定永远不会自动共享给使用它们的包。(删除了我的原始评论,因为我无法编辑它,我不想让不正确的信息留在那里。)然而,对于我的实际问题,我假设你的答案将与当前接受的答案一致?这种重新定义不会留下永久性的问题吗?