Crear un objeto polinómica de un número mediante el cambio de clase
-
22-09-2019 - |
Pregunta
he escrito una clase polinomio a lo largo de las líneas descritas en SICP 2.5.3 (excepto usando defclass). Me gustaría ser capaz de añadir a la perfección y polinomios se multiplican y los números regulares, pero no puedo hacer el cambio de clase aceptar un número.
I tratado de simplificar el problema cambiando la clase de un número entero a un flotador:
(change-class 4 'float)
pero eso me dio el error:
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]
I conseguir un error de la misma forma a partir de (FYI):
(change-class 4 'polynomial)
Me voy a seguir adelante y poner en práctica una conversión manual, pero yo preferiría utilizar las instalaciones incorporadas clos.
Como puntos XACH a cabo podría utilizar coaccionar o flotador para cambiar 4 a un flotador. Que fue concebido como un ejemplo más simple de lo que estaba tratando de hacer y para eliminar cualquier posibilidad de mi actualización de instancia para la clase diferente a equivocarse.
Esta es la versión más larga de lo que he intentado que no funcionó:
(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)
sigo teniendo un error como el ejemplo anterior:
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]
Solución
No se puede utilizar CAMBIO DE CLASE con los números. Los números no son instancias de clases CLOS. CAMBIO-CLASS También se cree que destructivamente modificar una instancia de una clase nueva, sin cambiar la identidad de la instancia original.
lo haría cualquiera:
-
Para cambiar los métodos add-clase que lo que quiere
-
o escribir un cambio de función, que implementa diversas reglas de conversión personalizada y pide CAMBIO DE CLASE para cualquier cambio de una clase a otra clase CLOS CLOS.
Otros consejos
Se puede utilizar coaccionar o flotar para hacer esto:
(float 4) => 4.0
(coerce 4 'float) => 4.0