我已经按照 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]