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]
¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top