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 に答える