这可能会永久性地意外覆盖编译器自己的功能吗?

时间:2013-10-17 06:17:18

标签: lisp common-lisp ccl

所以我正在编写自己的函数,我称它为make-list,我从调试器得到了这个:

   The function MAKE-LIST is predefined in Clozure CL.
   [Condition of type SIMPLE-ERROR]

   Restarts:
   0: [CONTINUE] Replace the definition of MAKE-LIST.

很好,但如果我不小心选择了选项0怎么办?我的编译器是否会被破坏并且永远有一个错误的内部函数定义,因为我会替换它?

2 个答案:

答案 0 :(得分:7)

只有当前正在运行的图像会被破坏,在这种情况下,您可以重新启动CCL以恢复它。

造成永久性伤害的唯一方法是保存图像,并选择覆盖原始图像文件。

答案 1 :(得分:0)

许多Lisp系统都是用Lisp自己编写的。

Clozure CL就是这样一个例子。 Clozure CL是用Clozure CL编写的(带有一些C和汇编程序)。 Clozure CL可以编译自己。

因此,Clozure CL中的许多/大多数Common Lisp函数都是用Clozure CL编写的。所以它需要某种开关,它允许定义或重新定义内置功能。因此,有一种方法可以编辑实现的源代码并进行更改。您的定义最好是“正确的”,这样L​​isp系统的功能就不会受到影响。请记住,重新定义通常不会对内联函数或已扩展的宏产生影响。

现在,如果我们作为典型的程序员使用Clozure CL,一些软件包会受到保护,并且不允许重新定义符号并发出错误信号。但您可以继续然后更改内部功能。正如许多Common Lisp一样,它们对变化持开放态度,但这需要你作为程序员做正确的事情。

如果你改变一个Lisp内部函数,有一些方法可以留下永久性伤害:

  • 保存图片并稍后再使用

  • 使用它来重新编译CCL本身或其中的一部分

  • 你可以编译一个文件,不知何故生成的代码可能与原始编译器不同

  • 你可以编译一个文件,不知何故生成的代码包含一个改变的Lisp函数的内联版本

如果加载这样的文件,它可以通过某个init文件自动进行,它包含更改,更改后的代码将成为当时正在运行的Lisp的一部分。