按地点价值读取数字列表? (ClojureScript技巧)

时间:2018-02-09 10:39:17

标签: clojure clojurescript

我今天想知道我是否有一个数字列表。 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?)。

2 个答案:

答案 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)

您可以简单apply str对您的数字序列起作用:

(apply str '(1 2 3))
;; => "123"