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 也被认为是破坏性地将实例修改为新类,而不改变原始实例的身份。

我会:

  • 添加方法到 CHANGE-CLASS 做你想做的事

  • 或者编写一个函数 CHANGE,它实现各种自定义强制规则并调用 CHANGE-CLASS 来实现从一个 CLOS 类到另一个 CLOS 类的任何更改。

于 2010-03-28T21:01:18.807 回答