質問

私はOpenMCL(まあ、今CCLと呼ばれる)とSLIMEを使用してOS X上でコードフォームポール・グレアムののANSI Common Lispのを光線追跡を実行しようとしています。このコードでは、そこにその値は構造体に定義された定数だ、と私はどちらかののスライムコンパイルとロード・ファイルまたはのスライムコンパイル関数定義のいずれかの上で呼び出すとき定数を使用する関数、Iは、エラーメッセージが表示されます:

  

いいえMAKE-LOAD-FORMメソッドが定義されていません   X 0:#S(POINTについて                                                    :Y 0                                                    :タイプのZ 200)[条件   SIMPLE-ERROR]

私は合併症を説明するポストを見つけそして、別の一つは、それを嘆いのが、何OpenMCLのこの態様を交渉するためのコードを追加する必要がある

役に立ちましたか?

解決

構造オブジェクト(およびオブジェクトのいくつかの他のタイプの)コードのようにリテラル、定数オブジェクトは、コンパイルファイルによって処理されて表示されたら、

、コンパイルFILEは、得られたバイナリファイルがロードされたとき、それを配置する方法を知っている必要が「同等の」オブジェクトが作成されます。 「同等」の多くの可能な定義があります。時々、それは他のオブジェクトとロードされたオブジェクトを共有構造のコンポーネントは、時にはそれが初期化が特定の方法で起こることが重要だ、と時々これらの事のどれも重要でないことが重要です。定数オブジェクトを再作成する方法を決定するには、COMPILE-FILEは、一般的な機能MAKE-LOAD-FORMを呼び出します。この動作は、任意のCLリファレンスまたはチュートリアルで説明されるべきです。 (参照またはチュートリアルも実装が構造クラスまたはSTANDARD-クラスのすべてのインスタンスに適用可能であろうデフォルトMAKE-LOAD-FORMメソッドを定義することができないことに注意しなければならないし、またそのMAKE-LOAD-FORM-SAVINGに注意してください-SLOTSは、複雑にする必要はありませんオブジェクトの初期化のためのMAKE-LOAD-FORMの方法で使用するのに便利な機能です。例:

(defmethod make-load-form ((p point) &optional env)
  (declare (ignore env))
  (make-load-form-saving-slots p))

コンパイルファイルが一定のポイントオブジェクトを保存する方法を決定するためにそれを呼び出すことができるように、その方法は、コンパイル時に定義されなければならないことに注意してください。

これのどれもCCL固有ではありません。何であるかもしれないことは、物事を一定に、リテラルオブジェクトであり、それらの問題であるものがありません。

のようなコードで

(defconstant a-point (make-point :x 0 :y 0 :z 200))

(defun return-a-point () a-point)

コンパイラの機能RETURN-A-POINTでそれを参照するため-POINTの値を代入することができ(しかし、必須ではありません)。 (コンパイラがそうするならば、それは希望 コード内のリテラル/定数POINTオブジェクトがコンパイルされているがあることを意味し、COMPILE-FILEは、オブジェクトを保存およびロードする方法を決定するためにMAKE-LOAD-FORMを呼び出す必要があります。コンパイラは、この置換を行わない場合は、MAKE-LOAD-FORMは、この例で呼び出される必要はありません。)

実装は、このような置換のかは実装に任されていているかどうか。スペックはまた、不特定DEFCONSTANT形態における値の形式はコンパイル時間、ロード時間、またはその両方で評価されているかどうかについて、それを残し、そして発現は常にに評価されることを保証するために(ユーザによって)注意が払われなければならないことに注意します同じ値ます。

CCLは、一般的に、コンパイル時にDEFCONSTANT値フォームを評価しようとすると、それらへの参照のための名前付き定数の値を代入についてかなり積極的です。いくつかのケースでは、これは、定数の価値観のクラスのMAKE-LOAD-FORMのメソッドが定義されなければならないことを意味します。他の実装は、オブジェクトの種類によっては、この置換を行うには消極的かもしれません。どちらの戦略が正しいか、およびポータブルコードが守られているどの戦略を前提とすることはできません(多くのうわさによれば、移植可能なコードは、確実に、そのような仮定を作るんが。)

DEFCONSTANTによって定義されたものの

別の治療は、この種のもの(予想外の呼び出しが誰の定義することが気に-LOAD-FORMにするために)の大部分がありそうな原因のように思えます。一つは、実行して移植する必要がありますように、これらの問題のいくつかを回避することができます:

(defconstant a-point (make-point :x 0 :y 0 :z 200))

(defun return-a-point () (load-time-value (symbol-value 'a-point)))

これは単純に(CCLがするように)一定の置換を行うためにそうすることを望んでいるの実装を可能にする同様の効果がありますが、LOAD-TIME-VALUEの使用が一定の値だけ負荷で評価されることを保証します時間(およびそのMAKE-LOAD-FORMは関与しません。)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top