我按照SICP 2.5.3中描述的方式写了一个多项式类(除了使用defclass)。我希望能够无缝地添加和乘法多项式和常数,但我不能让变更类接受数字。
我试图通过将类从整数更改为float来简化问题:
(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]
答案 0 :(得分:2)
您可以使用COERCE或FLOAT来执行此操作:
(float 4) => 4.0
(coerce 4 'float) => 4.0
答案 1 :(得分:1)
您不能将CHANGE-CLASS用于数字。数字不是CLOS类的实例。 CHANGE-CLASS也被认为破坏性地将实例修改为新类,而不改变原始实例的身份。
我要么:
为CHANGE-CLASS添加符合要求的方法
或编写一个函数CHANGE,它实现各种自定义强制规则,并对从一个CLOS类到另一个CLOS类的任何更改调用CHANGE-CLASS。