我可以在repl中读取这样的一些数据。对于一个真正的程序,我计划以一种特殊形式分配。
(def x1 (line-seq (BufferedReader. (StringReader. x1))))
如果我输入5 5,x1将被绑定(“5 5”)
我想将一个元素的列表转换为两个整数的列表。我怎样才能做到这一点?我一直在玩解析空格上的字符串,但是在执行转换为整数时遇到了麻烦。
答案 0 :(得分:8)
这有帮助吗?在Clojure 1.3.0中:
(use ['clojure.string :only '(split)])
(defn str-to-ints
[string]
(map #(Integer/parseInt %)
(split string #" ")))
(str-to-ints "5 4")
; => (5 4)
(apply str-to-ints '("5 4"))
; => (5 4)
如果您使用的Clojure版本没有clojure.string
命名空间,您可以跳过use
命令并按以下方式定义该函数。
(defn str-to-ints
[string]
(map #(Integer/parseInt %)
(.split #" " string)))
您可以在最后一行使用(.split string " ")
删除正则表达式。
答案 1 :(得分:4)
适用于所有数字,如果不是数字,则返回nil(因此您可以在生成的seq中过滤掉nils)
(require '[clojure.string :as string])
(defn parse-number
"Reads a number from a string. Returns nil if not a number."
[s]
(if (re-find #"^-?\d+\.?\d*$" s)
(read-string s)))
E.g。
(map parse-number (string/split "1 2 3 78 90 -12 0.078" #"\s+"))
; => (1 2 3 78 90 -12 0.078)
答案 2 :(得分:1)
字符串可以用括号括起来,然后用读取字符串函数计算为 clojure 列表:
(def f #(read-string (str "(" % ")")))
(f "5 4")
; => (5 4)