2017-12-13 2 views
1

Ich versuche, eine Textdatei zu öffnen und sie in eine Liste von Integer-Werten in Clojure aufzuteilen. Ich bekomme diesen Fehlercode jedes Mal, und ich habe keine Ahnung warum. Ich bin relativ neu in Lisp Entwicklung (ich meine ich begann vor zwei Stunden), also könnte es sein, dass ich eine wirklich dumme Frage stelle. ProstLisp: Ich weiß nicht, wie ich ISeq aus Java.lang.Integer erstellen kann

(ns clojure.examples.hello 
    (:gen-class)) 

(ns clojure-noob.core) 

(defn toInt [s] 
    (Integer/parseInt (re-find #"\A-?\d+" s))) 
(defn toIntList [s] 
    (if (not s)() 
    (list* (toInt (first (toInt s)) (toIntList first((rest 
    (clojure.string/split s #" ")))))) 
) 
) 

(println (str (toIntList (slurp "hab.txt")))) 
+0

Könnten Sie ein Beispiel Input buchen wie das, was 'hab.txt' enthalten würde? –

+0

nur ein paar ganze Zahlen getrennt durch Leerzeichen –

Antwort

1

Unter der Annahme, hab.txt nur eine einzige Zeile durch Leerzeichen getrennte ganzen Zahlen ist, sollte diese Arbeit:

(defn to-int [s] 
    (Integer/parseInt (re-find #"\A-?\d+" s))) 
(defn parse-int-str [s] 
    (map to-int (clojure.string/split s #" "))) 
(println (parse-int-str "1 2 3 4 5")) 
=> (1 2 3 4 5) 

Oder eine rekursive Version wie gewünscht:

(defn parse-int-str [s] 
    (loop [nums [] 
     strs (clojure.string/split s #" ")] 
    (if (seq strs) 
     (recur (conj nums (to-int (first strs))) 
      (rest strs)) 
     nums))) 

Sie könnten dies tun ohne loop/recur aber Sie riskieren anstrengenden Stapelplatz. Sie könnten auch darüber nachdenken, dies mit reduce zu tun.

+1

Oh, ich habe wirklich vergessen, die Kartenfunktion, danke: D Übrigens wäre es toll, wenn ich eine Version mit Rekursion hätte, nur um mich sehen zu lassen, wo ich den Fehler gemacht –

+0

@ MártonKardos map, reduce, filter, apply sind die Schweizer Taschenmesser von FP – sova

2

Der Grund, warum Sie diese Fehlermeldung erhalten, ist, dass Sie (irgendwo) fälschlicherweise eine Funktion aufrufen, die ein Sequenzargument mit einem Ganzzahlargument erwartet. Ein Ort, dies sein könnte, ist hier:

(first (toInt s)) 

Die Funktion first erwartet eine Folge (ISeq), noch toInt eine ganze Zahl zurück.

Und nur um zu bestätigen:

(first (java.lang.Integer/parseInt "10")) 

Illegal Sie wissen nicht, wie iseq erstellen aus: java.lang.Integer

0

Lassen Sie uns eine Datei vorbereitet:

(spit "foo.txt" " 3 5 662 35 3 ") 

Jetzt lesen wir die Datei, teilen die Zeichenfolge durch leere Symbole, entfernen leere und parsen sie in ganze Zahlen. Der Code

(as-> 
    "foo.txt" $ 
    (slurp $) 
    (clojure.string/split $ #"\s+") 
    (remove empty? $) 
    (mapv #(java.lang.Integer/parseInt %) $)) 

gibt

[3 5 662 35 3] 
Verwandte Themen