所以我正在编写自己的函数,我称它为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
怎么办?我的编译器是否会被破坏并且永远有一个错误的内部函数定义,因为我会替换它?
答案 0 :(得分:7)
只有当前正在运行的图像会被破坏,在这种情况下,您可以重新启动CCL以恢复它。
造成永久性伤害的唯一方法是保存图像,并选择覆盖原始图像文件。
答案 1 :(得分:0)
许多Lisp系统都是用Lisp自己编写的。
Clozure CL就是这样一个例子。 Clozure CL是用Clozure CL编写的(带有一些C和汇编程序)。 Clozure CL可以编译自己。
因此,Clozure CL中的许多/大多数Common Lisp函数都是用Clozure CL编写的。所以它需要某种开关,它允许定义或重新定义内置功能。因此,有一种方法可以编辑实现的源代码并进行更改。您的定义最好是“正确的”,这样Lisp系统的功能就不会受到影响。请记住,重新定义通常不会对内联函数或已扩展的宏产生影响。
现在,如果我们作为典型的程序员使用Clozure CL,一些软件包会受到保护,并且不允许重新定义符号并发出错误信号。但您可以继续然后更改内部功能。正如许多Common Lisp一样,它们对变化持开放态度,但这需要你作为程序员做正确的事情。
如果你改变一个Lisp内部函数,有一些方法可以留下永久性伤害:
保存图片并稍后再使用
使用它来重新编译CCL本身或其中的一部分
你可以编译一个文件,不知何故生成的代码可能与原始编译器不同
你可以编译一个文件,不知何故生成的代码包含一个改变的Lisp函数的内联版本
如果加载这样的文件,它可以通过某个init文件自动进行,它包含更改,更改后的代码将成为当时正在运行的Lisp的一部分。