Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lisp 这可能会永久且意外地覆盖编译器';它自己的功能?_Lisp_Common Lisp_Ccl - Fatal编程技术网

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*
;包中的重新绑定永远不会自动共享给使用它们的包。(删除了我的原始评论,因为我无法编辑它,我不想让不正确的信息留在那里。)然而,对于我的实际问题,我假设你的答案将与当前接受的答案一致?这种重新定义不会留下永久性的问题吗?