3

所以我正在编写自己的函数并调用它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?我的编译器是否会损坏并永远对内部函数进行错误的定义,就像我会替换它一样?

4

2 回答 2

7

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

做永久损坏的唯一方法是保存图像,并选择覆盖原始图像文件。

于 2013-10-17T07:10:13.733 回答
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 的一部分。

于 2013-10-18T22:03:49.977 回答