为总的noob问题道歉,而不是努力开始使用Clojure。
我有一个字符串"buy=1|sell=2|limit=3|stop=4"
,我正在尝试将其转换为地图
:buy 1
:sell 2
:limit 3
:stop 4
到目前为止我已经
了(require '[clojure.string :as str])
=> nil
(def line "buy=1|sell=2|limit=3|stop=4")
=> #'user/line
(str/split line #"\|")
=> ["buy=1" "sell=2" "limit=3" "stop=4"]
现在分开第二次我想我想把一个函数映射到seq,所以像
map (str/split #"\=") (str/split line #"\|")
=> ArityException Wrong number of args (1) passed to: string/split clojure.lang.AFn.throwArity (AFn.java:429)
我正在尝试传递部分应用的函数,但怀疑我的语法是否正确。我传递分隔符作为函数的第一个参数,但是要分割的字符串应该首先传递,所以这肯定是不正确的。
任何有关更加惯用的方式的指示都会感激不尽。
答案 0 :(得分:2)
(def s "buy=1|sell=2|limit=3|stop=4")
(partition 2 (clojure.string/split s #"[=|]"))
会给你
(("购买"" 1")("销售"" 2")("限制"& #34; 3")("停止"" 4")
现在我们缩减为{}并转换" 1" 1,"买" in:购买
(reduce (fn [acc [k v]] (assoc acc (keyword k) (Integer. v))) {} (partition 2 (clojure.string/split s #"[=|]")))
给你
{:停止4,:限制3,:卖2,买1}
可能不是最好的,但是直截了当且有效。
答案 1 :(得分:1)
这是一种方法:
(def st "buy=1|sell=2|limit=3|stop=4")
(->> (clojure.string/split st #"\|")
(map #(re-matches #"(.+)=(.+)" %))
(map (fn [[_ key value]] [(keyword key) value]))
(into {}))
返回:
{:buy "1", :sell "2", :limit "3", :stop "4"}
答案 2 :(得分:1)
re-seq
是你的朋友......
(def s "buy=1|sell=2|limit=3|stop=4")
(->> s
(re-seq #"(\w+)=(\d+)")
(map (fn [[_ k v]] [(keyword k) (Integer/parseInt v)]))
(into {}))
;=> {:buy 1, :sell 2, :limit 3, :stop 4}