Frage

Ich habe eine Polynom-Klasse entlang der Linien in SICP 2.5.3 (mit Ausnahme der Verwendung defclass) beschrieben geschrieben. Ich möchte in der Lage sein, nahtlos hinzufügen und mehrfach Polynome und regelmäßige Zahlen, aber ich kann nicht Veränderungs-Klasse akzeptiert eine Reihe machen.

Ich habe versucht, das Problem zu vereinfachen, indem Klasse aus einer ganzen Zahl mit einem Schwimmer zu ändern:

(change-class 4 'float)

, aber das gab mir den Fehler:

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]

ich einen Fehler von derselben Form erhalten aus (FYI):

(change-class 4 'polynomial)

Ich gehe voran gehen und eine manuelle Konvertierung zu implementieren, aber ich würde es vorziehen, die eingebauten in clos Einrichtungen zu nutzen.

Als Xach Punkte I coerce verwenden könnte oder schwimmen 4 mit einem Schwimmer zu ändern. , Der als einfaches Beispiel gedacht war, was ich versuche zu tun und jede Möglichkeit meiner Update-Instanz-für-andere-Klasse, falsch zu entfernen.

Hier ist die längere Version von dem, was ich versuchte, das nicht funktioniert hat:

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

ich noch einen Fehler wie das obigen Beispiel erhalten:

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]
War es hilfreich?

Lösung

Sie können nicht Veränderungs-Klasse mit Zahlen verwenden. Die Zahlen sind nicht Instanzen von CLOS Klassen. Veränderungs-Klasse wird auch gedacht, um destruktiv eine Instanz zu einer neuen Klasse ändern, ohne die Identität der ursprünglichen Instanz zu ändern.

Ich würde entweder:

  • Add-Methoden zu Veränderungs-Klasse, das tut, was Sie wollen

  • oder schreiben Sie eine Funktion zu ändern, dass Geräte verschiedene individuellen Zwang Regeln und rufen Veränderungs-Klasse für jede Änderung von einem CLOS Klasse in einer anderen Klasse CLOS.

Andere Tipps

Sie können COERCE oder FLOAT verwenden, das zu tun:

(float 4) => 4.0
(coerce 4 'float) => 4.0
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top