0

umgewandelt werden Ich habe versucht, eine Funktion zu schreiben, um eine Zeile zu verarbeiten, indem ich str \ split, die Funktion, aufruft funktioniert gut, wenn ich es direkt im LEIN REPL-Fenster anrufe, aber den obigen Aufruffehler bei dem Versuch, das Programm von LEIN RUN zu starten, treffen wird. Irgendwelche Vorschläge?Clojure clojure.string/split hit java.lang.ClassCastException: clojure.lang.LazySeq kann nicht in java.lang.CharSequence

(let [num-letters (count (apply str line)) 
     num-spaces-needed (- column-length num-letters) 
     num-words (count (clojure.string/split line #"\s")) 
     num-space-in-group (if (= 1 num-words) num-spaces-needed (/ num-spaces-needed (- num-words 1))) 
     group-of-spaces (repeat num-space-in-group " ") 
     padding (create-list-spaces num-spaces-needed (dec (count line)))] 
    ( clojure.string/join "" (if (empty? padding) (cons line group-of-spaces) 
       (cons (first line) (interleave (rest line) padding))))) 
+0

Können Sie genau zeigen, wie Sie diesen Code aufrufen, sowohl mit "lein repl" als auch mit "lein run"? –

Antwort

1

Ich nehme an, Sie line als Parameter an Ihre Funktion übergeben, obwohl es aus dem Code-Schnipsel weggelassen wurde.

Sie sollten auf Unterschiede im Parameter line prüfen, wenn Sie die Funktion von diesen zwei verschiedenen Einstiegspunkten aufrufen. Zuerst nennen wir Ihre Funktion tokenize für die Bequemlichkeit. Nun schafft die Vanille app Vorlage in Leiningen ein -main, die dieser recht ähnlich sieht, nachdem ich den tokenize Anruf hinzufügen:

(defn -main 
    [& args] 
    (tokenize args)) 

Die Argumente werden destrukturierte mit dem Rest Operator &, die eine Seq der Argumente baut (args). Wenn Sie das also mit lein run I want this to work! ausführen, rufen Sie die Funktion tokenize mit einer Sequenz auf. clojure.string/split kann nicht auf eine Sequenz angewendet werden, und Sie erhalten einen Stack-Trace.

Wenn Sie jedoch Ihre Funktion von lein repl aufrufen, ist ein natürlicher Weg, um es zu tun mit einem Zauber wie (tokenize "Iä! Iä! Cthulhu fhtang!"). Dies funktioniert, da Ihr Aufrufparameter jetzt nur eine Zeichenfolge und keine Sequenz ist.

Am Ende kommt es darauf an, wie Sie Ihre Funktion aufrufen. Eine sicherere Antwort würde Details dazu erfordern, wie @sam-estep kommentierte.

Verwandte Themen