我正在尝试打开一个文本文件并将其拆分为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"))))
答案 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]