我今天想知道我是否有一个数字列表。 ClojureScript中是否有一个函数返回一个由数字按地点值编号的数字? (我不是指list()
,而只是一些数字)
例如:
我有一些数字1,2,3,我正在寻找一个将其转换为123(一百二十三)的功能。
我以为我找到了read-string
(read-string (str 1 2 3))
;=> 123
但遗憾的是,如果我想在下面讨论的功能中使用它,它就不能正常工作。
我有一个" functionmade"映射键是向量,值是数字。像这样: {[0 0] 0,[0 1] 1,... [4 5] 45,... [9 9] 99}
我可以在此地图上使用get
功能的唯一方法是:
(get {[0 2] 2} [0 2])
;=> 2
; or
(get {[4 5] 45} [4 5])
;=> 45
这是研磨,但它有效。为了使它看起来更好我试图定义一个函数,我使用read-string
:(读/指cljs.reader)
(defn get-oxo [x y]
(get {[x y] (read/read-string (str x y))} [x y]))
;So i can use it like this for e.g.:
(get-oxo 4 5)
;=> 45
它还返回不在地图中的值:
(get-oxo 112 358)
;=> 112358
我认为问题是这种方式get-oxo
不返回配对键的值,而是从x y ...
所以问题是如何修复它以返回配对键的值,而不是从我给函数的数字构造的数字?
(如果我想生成一个数字范围更广的地图,还有另一个问题,例如不仅仅是0-9而是0-99。这样get-oxo
的algorythm不是真的。我用的是函数讨论于:ClojureScript zipmap tricks me or what?)。
答案 0 :(得分:1)
问题是你得到了什么:
只需分解你的功能就可以清楚地看到它:
(defn get-oxo [x y]
(let [new-map {[x y] (read/read-string (str x y))}]
(println new-map)
(get new-map [x y])))
#'user/get-oxo
user> (get-oxo 100 200)
;;=> {[100 200] 100200}
;;=> 100200
所以你在函数中生成你的地图,并获得它的关键 你会得到......一种完全有效的行为
要从您的地图获取内容,您需要将您的地图作为get
功能的第一个参数
(defn get-oxo [input x y]
(get input [x y]))
#'user/get-oxo
user> (def data {[0 0] 0 [0 1] 1 [0 2] 2})
#'user/data
user> (get-oxo data 0 1)
1
user> (get-oxo data 2 3)
nil
然后,如果您需要密钥(我的意思是来自地图的对)而不是值,您可以使用find
函数代替get
以这种方式进行修改:
(defn get-oxo [input x y]
(first (find input [x y])))
#'user/get-oxo
user> (get-oxo data 0 1)
[0 1]
user> (get-oxo data 2 3)
nil
写入和读取字符串以获取数字看起来多余。您可以轻松地为此创建一个简单的功能:
(defn digits->num [digits]
(reduce (fn [acc d] (+ (* 10 acc) d))
0
digits))
#'user/digits->num
user> (digits->num [0])
0
user> (digits->num [])
0
user> (digits->num [1])
1
user> (digits->num [1 2 3 4])
1234
user> (digits->num [0 0 1 0])
10
答案 1 :(得分:0)