2

SICP 2.5.3で説明されている行に沿って多項式クラスを作成しました(defclassの使用を除く)。多項式とハミング数をシームレスに加算および乗算できるようにしたいのですが、change-classに数値を受け入れさせることはできません。

クラスを整数から浮動小数点に変更して、問題を単純化しようとしました。

(change-class 4 'float)

しかし、それは私にエラーを与えました:

There is no applicable method for the generic function
#<STANDARD-GENERIC-FUNCTION CHANGE-CLASS (7)>
when called with arguments
(4 #<BUILT-IN-CLASS FLOAT>).
[Condition of type SIMPLE-ERROR]

(fyi)から同じ形式のエラーが発生します:

(change-class 4 'polynomial)

先に進んで手動変換を実装しますが、組み込みのclos機能を使用したいと思います。

Xachが指摘しているように、強制またはフロートを使用して4をフロートに変更できます。これは、私がやろうとしていたことのより簡単な例として、また、update-instance-for-different-classが間違っている可能性を排除することを目的としていました。

これが私が試したものの長いバージョンで、うまくいきませんでした:

(defclass polynomial ()
 ((var :accessor var :initarg :var :initform 'x)
  (terms :accessor terms :initarg :terms :initform (make-empty-term-list))))

(defmethod update-instance-for-different-class :before ((old number) 
                        (new polynomial)
                        &key)
    (setf (slot-value new 'terms) (adjoin-term (make-term old 0)
                           (make-empty-term-list))))

(change-class 4 'polynomial)

上記の例のようなエラーがまだ発生します。

There is no applicable method for the generic function
  #<STANDARD-GENERIC-FUNCTION CHANGE-CLASS (7)>
when called with arguments
  (4 #<STANDARD-CLASS POLYNOMIAL>).
   [Condition of type SIMPLE-ERROR]
4

2 に答える 2

2

COERCEまたはFLOATを使用して、次のことを行うことができます。

(float 4) => 4.0
(coerce 4 'float) => 4.0
于 2010-03-28T14:29:50.083 に答える
1

CHANGE-CLASSを数字で使用することはできません。数値はCLOSクラスのインスタンスではありません。CHANGE-CLASSは、元のインスタンスのIDを変更せずに、インスタンスを新しいクラスに破壊的に変更することも考えられています。

私はどちらかです:

  • 必要なことを実行するメソッドをCHANGE-CLASSに追加します

  • または、さまざまなカスタム強制ルールを実装し、あるCLOSクラスから別のCLOSクラスへの変更に対してCHANGE-CLASSを呼び出す関数CHANGEを記述します。

于 2010-03-28T21:01:18.807 に答える