Lisp: Weet niet hoe je ISeq van Java.lang.Integer moet maken

Ik probeer een tekstbestand te openen en op te splitsen in een lijst met gehele waarden in Clojure. Ik krijg deze foutcode elke keer weer, en ik heb geen idee waarom. Ik ben relatief nieuw bij de ontwikkeling van Lisp (ik bedoel, ik ben twee uur geleden begonnen), dus het kan zijn dat ik een heel domme vraag stel. Proost

(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"))))
1
Zou je een voorbeeldinvoer kunnen plaatsen zoals wat hab.txt zou bevatten?
toegevoegd de auteur Taylor Wood, de bron
Zou je een voorbeeldinvoer kunnen plaatsen zoals wat hab.txt zou bevatten?
toegevoegd de auteur Taylor Wood, de bron
slechts een aantal hele getallen gescheiden door spaties
toegevoegd de auteur Márton Kardos, de bron
slechts een aantal hele getallen gescheiden door spaties
toegevoegd de auteur Márton Kardos, de bron
slechts een aantal hele getallen gescheiden door spaties
toegevoegd de auteur Márton Kardos, de bron

6 antwoord

De reden dat u die foutmelding krijgt, is dat u (ergens) ten onrechte een functie aanroept die een reeksargument verwacht met een geheel-getalargument. Eén plek die dit zou kunnen zijn, is hier:

(first (toInt s))

De functie eerste verwacht een reeks ( ISeq ), maar toInt retourneert een geheel getal.

En alleen om te bevestigen:

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

IllegalArgumentException Weet niet hoe u ISeq maakt van: java.lang.Integer

2
toegevoegd

De reden dat u die foutmelding krijgt, is dat u (ergens) ten onrechte een functie aanroept die een reeksargument verwacht met een geheel-getalargument. Eén plek die dit zou kunnen zijn, is hier:

(first (toInt s))

De functie eerste verwacht een reeks ( ISeq ), maar toInt retourneert een geheel getal.

En alleen om te bevestigen:

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

IllegalArgumentException Weet niet hoe u ISeq maakt van: java.lang.Integer

2
toegevoegd

Ervan uitgaande dat hab.txt slechts één regel is van door spaties gescheiden gehele getallen, zou dit moeten werken:

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

Of een recursieve versie zoals gevraagd:

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

U kunt dit doen zonder loop / recur maar u riskeert vermoeiende stapelruimte. Je zou ook kunnen denken om dit te doen met verminderen .

1
toegevoegd
@ MártonKardos kaart, verminderen, filteren, toepassen zijn het Zwitsers zakmes van FP
toegevoegd de auteur sova, de bron
Oh, ik ben de kaartfunctie echt vergeten, bedankt: D Trouwens, het zou geweldig zijn als ik een versie had die recursie gebruikt, alleen om me te laten zien waar ik de fout heb gemaakt
toegevoegd de auteur Márton Kardos, de bron

Ervan uitgaande dat hab.txt slechts één regel is van door spaties gescheiden gehele getallen, zou dit moeten werken:

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

Of een recursieve versie zoals gevraagd:

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

U kunt dit doen zonder loop / recur maar u riskeert vermoeiende stapelruimte. Je zou ook kunnen denken om dit te doen met verminderen .

1
toegevoegd
@ MártonKardos kaart, verminderen, filteren, toepassen zijn het Zwitsers zakmes van FP
toegevoegd de auteur sova, de bron
Oh, ik ben de kaartfunctie echt vergeten, bedankt: D Trouwens, het zou geweldig zijn als ik een versie had die recursie gebruikt, alleen om me te laten zien waar ik de fout heb gemaakt
toegevoegd de auteur Márton Kardos, de bron

Laten we een bestand voorbereiden:

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

Laten we nu het bestand lezen, de string door lege symbolen splitsen, lege verwijderen en ze in gehele getallen parseren. De code

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

geeft

[3 5 662 35 3]
0
toegevoegd

Laten we een bestand voorbereiden:

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

Laten we nu het bestand lezen, de string door lege symbolen splitsen, lege verwijderen en ze in gehele getallen parseren. De code

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

geeft

[3 5 662 35 3]
0
toegevoegd