Question

J'ai écrit une classe polynomiale le long des lignes décrites dans SICP 2.5.3 (sauf en utilisant defclass). Je voudrais être en mesure d'ajouter de façon transparente et multiplier les polynômes et les numéros réguliers, mais je ne peux pas faire le changement de classe accepte un certain nombre.

J'ai essayé de simplifier le problème en changeant la classe d'un nombre entier à un flotteur:

(change-class 4 'float)

mais cela m'a donné l'erreur:

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]

Je reçois une erreur de la même forme de (FYI):

(change-class 4 'polynomial)

Je vais aller de l'avant et mettre en œuvre une conversion manuelle, mais je préférerais utiliser les installations clos intégrées.

Comme le souligne Xach que je pouvais utiliser exercer des pressions ou flotter pour changer 4 à un flotteur. Cela a été destiné comme un exemple plus simple de ce que je voulais faire et d'éliminer toute possibilité de ma mise à jour instance-pour-classe différente se tromper.

Voici la version plus longue de ce que j'ai essayé qui ne fonctionne pas:

(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)

Je reçois toujours une erreur comme dans l'exemple ci-dessus:

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]
Était-ce utile?

La solution

Vous ne pouvez pas utiliser CHANGE-classe avec des chiffres. Les chiffres ne sont pas des instances de classes CLOS. CHANGEMENT DE CLASSE est également considérée comme destructivement modifier une instance à une nouvelle classe, sans changer l'identité de l'instance d'origine.

Je voudrais soit:

  • ajouter des méthodes de changement CLASS qui fait ce que vous voulez

  • ou écrire un changement de fonction, qui met en œuvre diverses règles de coercition personnalisées et appelle CHANGE-classe pour tout changement d'une classe à une autre classe CLOS CLOS.

Autres conseils

Vous pouvez utiliser COERCE ou FLOAT pour le faire:

(float 4) => 4.0
(coerce 4 'float) => 4.0
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top