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]