Lisp:Java.lang.IntegerからISeqを作成する方法がわからない

テキストファイルを開き、それをClojureの整数値のリストに分割しようとしています。私はこのエラーコードを毎回受け取ります、そして私はなぜかわからない。私はLispの開発には比較的慣れていないので(2時間前に始めたということです)、本当に馬鹿げた質問をしているのかもしれません。乾杯

(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
hab.txt に含まれるようなサンプル入力を投稿できますか。
追加された 著者 Taylor Wood,
hab.txt に含まれるようなサンプル入力を投稿できますか。
追加された 著者 Taylor Wood,
スペースで区切られた単なる整数の束
追加された 著者 Márton Kardos,
スペースで区切られた単なる整数の束
追加された 著者 Márton Kardos,
スペースで区切られた単なる整数の束
追加された 著者 Márton Kardos,

6 答え

このエラーメッセージが表示されるのは、整数引数を持つシーケンス引数を必要とする関数を(どこかで)誤って呼び出しているからです。これがあるかもしれない1つの場所はここにあります:

(first (toInt s))

関数 first にはシーケンス( ISeq )が必要ですが、 toInt は整数を返します。

そして確認するだけです:

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

IllegalArgumentException:ISeqをjava.lang.Integerから作成する方法がわからない

2
追加された

このエラーメッセージが表示されるのは、整数引数を持つシーケンス引数を必要とする関数を(どこかで)誤って呼び出しているからです。これがあるかもしれない1つの場所はここにあります:

(first (toInt s))

関数 first にはシーケンス( ISeq )が必要ですが、 toInt は整数を返します。

そして確認するだけです:

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

IllegalArgumentException:ISeqをjava.lang.Integerから作成する方法がわからない

2
追加された

hab.txt が単一行のスペース区切り整数であると仮定すると、これはうまくいくはずです。

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

または要求に応じて再帰的なバージョン:

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

loop / recur がなくてもこれは可能ですが、スタックスペースが浪費される危険があります。 reduce を使ってこれを行うことも考えられます。

1
追加された
@MártonKardosマップ、縮小、フィルタリング、適用はFPのスイスアーミーナイフです。
追加された 著者 sova,
ああ、私は本当にmap関数を忘れていました、ありがとう:Dところで、再帰を使ったバージョンを持っていたならば、間違いを犯した場所を見るためだけにそれは素晴らしいことです。
追加された 著者 Márton Kardos,

hab.txt が単一行のスペース区切り整数であると仮定すると、これはうまくいくはずです。

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

または要求に応じて再帰的なバージョン:

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

loop / recur がなくてもこれは可能ですが、スタックスペースが浪費される危険があります。 reduce を使ってこれを行うことも考えられます。

1
追加された
@MártonKardosマップ、縮小、フィルタリング、適用はFPのスイスアーミーナイフです。
追加された 著者 sova,
ああ、私は本当にmap関数を忘れていました、ありがとう:Dところで、再帰を使ったバージョンを持っていたならば、間違いを犯した場所を見るためだけにそれは素晴らしいことです。
追加された 著者 Márton Kardos,

ファイルを準備しましょう。

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

それではファイルを読み、空のシンボルで文字列を分割し、空のものを削除して整数に解析しましょう。コード

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

与える

[3 5 662 35 3]
0
追加された

ファイルを準備しましょう。

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

それではファイルを読み、空のシンボルで文字列を分割し、空のものを削除して整数に解析しましょう。コード

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

与える

[3 5 662 35 3]
0
追加された