2016-09-30 1 views
0

Ich habe diese Multi-Funktion in clojure geschrieben.Probleme mit der Defmulti Versandfunktion

(defmulti printlmt (fn [s] (> (count s) 10))) 
(defmethod printlmt true [s] (println s)) 
(defmethod printlmt false [s] (println (take 10 s))) 

ich dann versuchen, es auszuführen, wie unten ..

(printlmt "test") 

Aber, halte ich die folgenden Fehler.

IllegalArgumentException No method in multimethod 'printlmt' for dispatch value: 4 clojure.lang.MultiFn.getFn (MultiFn.java:156) 

In meinem Verständnis soll die anonyme Funktion einen Wert von true zurückzukehren. Warum gibt die anonyme Funktion 4 zurück?

Wenn ich rufe Sie die Sendefunktion getrennt, wie diese

((fn [s] (> (count s) 0)) "test") 

In diesem Fall ist es true zurück!

Edit: ich das Terminal Text bin hinzugefügt, die ich habe:

startingclojure.core=> (defmulti printlmt (fn [s] (> (count s) 10))) 
nil 
startingclojure.core=> (defmethod printlmt true [s] (println s)) 
#object[clojure.lang.MultiFn 0x3315fe88 "[email protected]"] 
startingclojure.core=> (defmethod printlmt false [s] (println (take 10 s))) 
#object[clojure.lang.MultiFn 0x3315fe88 "[email protected]"] 
startingclojure.core=> 

startingclojure.core=> (printlmt "test") 

IllegalArgumentException No method in multimethod 'printlmt' for dispatch value: 4 clojure.lang.MultiFn.getFn (MultiFn.java:156) 
startingclojure.core=> 
+0

Ihr Code funktioniert für mich – Lee

+0

@Lee Ich habe den eigentlichen Konsolentext hinzugefügt. Kannst du sehen, ob etwas nicht stimmt? – Teddy

+2

Kein Problem mit beiden Code. hast du versucht, zu beenden und dann neu zu starten? Dumme Frage, aber vielleicht ist eine alte falsche Definition von printlmt immer noch hier –

Antwort

2

Wenn Sie möchten Ihre ers nicht neu starten, um ein Verfahren neu zu definieren, verwenden Sie remove-method

https://clojuredocs.org/clojure.core/remove-method

(remove-method printlmt true) 

dann neu definieren.

EDIT
können Sie

(ns-unmap *ns* 'printlmt) 

Note verwenden:ns-unmap erfordert auch alle Ihre Methoden neu zu definieren.

+0

Danke! Das funktioniert, und auch (remove-all-methods multifn). Das hilft mir immer noch nicht, die Defmulti-Dispatch-Funktion neu zu definieren. Ich versuche Defmulti nochmal mit einer anderen Funktion, aber es funktioniert immer noch auf die alte Art und Weise. Zum Beispiel habe ich in meinem Fall die Schalterlänge von 10 auf 5 geändert. Immer noch wird die "wahre" Methode bis Länge 10 aufgerufen. – Teddy

+0

@Teddy siehe meine Bearbeitung. –

+0

Danke! ns-unmap hat funktioniert! Allerdings, und das ist wahrscheinlich eine andere Frage, ich konnte nicht finden, wie alle Def-Methoden in einem Defmulti aufgelistet werden. Die Methoden werden beim Aufrufen von dir im Namespace nicht angezeigt. Und das Aufrufen der Quelle für den Namen der Multi-Methode hilft auch nicht. – Teddy