Я написал полиномиальный класс в соответствии со строками, описанными в SICP 2.5.3 (за исключением использования defclass). Я хотел бы иметь возможность легко складывать и умножать многочлены и обычные числа, но я не могу заставить класс изменения принимать число.
Я попытался упростить проблему, изменив класс с целого числа на число с плавающей запятой:
(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)
Я собираюсь реализовать ручное преобразование, но я бы предпочел использовать встроенные средства закрытия.
Как указывает Xach, я мог бы использовать coerce или float, чтобы изменить 4 на float. Это было задумано как более простой пример того, что я пытался сделать, и исключить любую возможность того, что мой экземпляр обновления для другого класса неверен.
Вот более длинная версия того, что я пробовал, но это не сработало:
(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]