2016-06-06 15 views
0

dies ist meine erste Frage hier und ich hoffe, Sie können mir helfen. Ich programmiere eine Merge-Funktion in Clojure. Ich teste meinen Code auf tryclojure und habe den Fehler im Titel bekommen.java.lang.ClassCastException: java.lang.Long kann nicht in clojure.lang.IFn umgewandelt werden

Hier ist mein Code

(def merge 
(fn [lon1 lon2] 
{:pre[(every? number? lon1)(every? number? lon2)] 
:post[(every? number? %)]} 
(cond 
(empty? lon1) lon2 
(empty? lon2)lon1 
:else 
(cons (min (first lon1) (first lon2)) 
(merge (rest lon1) (rest lon2)))))) 
#'sandbox7750/merge 
> (merge (1,2,5) (3,4)) 
java.lang.ClassCastException: java.lang.Long cannot be cast to clojure.lang.IFn 

Also, was ist das Problem hier? Suchen Sie nach vorne auf eine Antwort :)

Grüße

+0

Könnten Sie bitte Ihre Frage verbessern? (Code Einrückungen, Groß-/Kleinschreibung in Sätzen) –

Antwort

0

Zunächst einmal müssen Sie Listen zitieren andernfalls werden sie ausgewertet und ihr erstes Element als Funktion behandelt und damit die Ausnahme aufgerufen werden:

(1,2,5) 
;; => java.lang.ClassCastException: java.lang.Long cannot be cast to clojure.lang.IFn 

Zitiert werden Ihnen helfen, eine Liste mit Zahlen zu erhalten:

'(1,2,5) 
;; => (1 2 5) 

Es ist auch mehr idiomatisches nicht Element-Trennzeichen zu verwenden (wie ,) und Sie können das oben gedruckte Formular sehen ((1 2 5)).

Wie es scheint, ist es eine Übung, ich lasse Sie andere Probleme in Ihrer merge Funktion beheben.

+0

Danke für Ihre Eingabe, es war in der Tat eine Übung. Ich hatte auch einige kleinere Fehler in meinem anderen Teil. ist die neue und Arbeitscode: 'Code (def fusionieren (fn [LON1 LON2] {: pre [? (Jede Zahl LON1) (jede Zahl LON2)?] : post [(jeder ? Nummer%)]} (? cond (leer LON1) LON2 (<(erster LON1) (erste LON2)) (cons (erste LON1) (merge (Rest LON1) LON2)) : else (cons (first lon2) (merge lon1 (rest lon2)))))) ' – Simon

+0

gibt es nicht so etwas wie automatische Formatierung? Dieser Code saugt zu lesen. – Simon

+0

Sie können formatierten Code einfach aus Ihrem Editor kopieren, in den StackOverflow-Editor einfügen, das Code-Snippet auswählen und auf das '{}' - Symbol klicken, um es als Code-Snippet zu markieren. –

0

Der richtige Aufruf ist (zusammenführen '(1 2 3)' (4 5)) oder (zusammenführen [1 2 3] [4 5]) (Kommas ist optional). Wenn Sie eine nicht angeführte Liste (1,2,3) schreiben, wird ein erstes Element als Funktion betrachtet. 1 ist keine Funktion und Sie erhalten die Fehlermeldung.

Verwandte Themen