Lisp:不知道如何从Java.lang.Integer创建ISeq

时间:2017-12-13 19:46:00

标签: java clojure lisp

我正在尝试打开一个文本文件并将其拆分为Clojure中的整数值列表。我每次都得到这个错误代码,我不知道为什么。我对Lisp开发相对较新(我的意思是我在两个小时前开始),所以我可能会问一个非常愚蠢的问题。干杯

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

3 个答案:

答案 0 :(得分:2)

您收到该错误消息的原因是(某处)您错误地调用了一个期望带有整数参数的序列参数的函数。这可能是一个地方:

(first (toInt s))

函数first需要一个序列(ISeq),但toInt正在返回一个整数。

只是为了确认:

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

IllegalArgumentException不知道如何创建ISeq:java.lang.Integer

答案 1 :(得分:1)

假设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执行此操作。

答案 2 :(得分: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]