将列表的字符串表示形式转换为 clojure 中的列表



如果我有

(def a "((a,"a1",0.533,0.122,0.608,0.258) 
(c,"c1",0.863,0.031,0.998,0.667) 
(b,"b1",0.53,0.117,0.609,0.256))")

我想要拥有

(def b '((a,"a1",0.533,0.122,0.608,0.258) 
(c,"c1",0.863,0.031,0.998,0.667) 
(b,"b1",0.53,0.117,0.609,0.256)))

我可以在哪里访问 b 中的每个元素

(first b) ; which should return (a,"a1",0.533,0.122,0.608,0.258) 

(type (first (first b)) ; returns clojure.lang.Symbol
(type (second (first b)) ; returns java.lang.String
(type (last (first b)) ; returns java.lang.Double

我试着只放(symbol a)但这似乎把整个字符串变成了一个符号。

你需要的是clojure.edn/read-string

user> (clojure.edn/read-string
"((a,"a1",0.533,0.122,0.608,0.258) (c,"c1",0.863,0.031,0.998,0.667)(b,"b1",0.53,0.117,0.609,0.256))")
;;=> ((a "a1" 0.533 0.122 0.608 0.258)
;;    (c "c1" 0.863 0.031 0.998 0.667)
;;    (b "b1" 0.53 0.117 0.609 0.256))
user> (def b (clojure.edn/read-string
"((a,"a1",0.533,0.122,0.608,0.258) (c,"c1",0.863,0.031,0.998,0.667) (b,"b1",0.53,0.117,0.609,0.256))"))
#'user/b
user> (first b)
;;=> (a "a1" 0.533 0.122 0.608 0.258)
user> (type (first (first b)))
;;=> clojure.lang.Symbol
user> (type (last (first b)))
;;=> java.lang.Double
user> (type (second (first b)))
;;=> java.lang.String

最新更新