Clojure 数字又回到了数字

Clojure 数字又回到了数字,clojure,Clojure,在Clojure中,很容易从数字中获取数字列表: user=> (digits 234432) (2 3 4 4 3 2) user=> (map type (digits 22)) (java.lang.Long java.lang.Long) 我的问题是如何反过来——如何从数字列表中创建数字 编辑好的点,如下所示: (defn digits [n] (->> n str (map (comp read-string str)))) 它来自我能想到的两种方式:

在Clojure中,很容易从数字中获取数字列表:

user=> (digits 234432)
(2 3 4 4 3 2)

user=> (map type (digits 22))
(java.lang.Long java.lang.Long)
我的问题是如何反过来——如何从数字列表中创建数字

编辑好的点,如下所示:

(defn digits [n]
  (->> n str (map (comp read-string str))))

它来自我能想到的两种方式:

使用
reduce

boot.user=> (reduce (fn [a b] (+ b (* a 10))) 0 '(1 2 3 4 5))
12345
使用
clojure.string/join
Long/parseLong

boot.user=> (Long/parseLong (clojure.string/join '(1 2 3 4 5)))
12345
请注意,如果任何数字大于9,则这两种方式的行为并不相同

如果需要对Bigint的支持,可以执行以下操作:

boot.user=> (def digits (repeat 100 1))
#'boot.user/digits
boot.user=> digits
(1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
boot.user=> (reduce (fn [a b] (+ b (* a 10))) 0N digits)
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111N
boot.user=> (bigint (clojure.string/join digits))
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111N

我可以想到两种方法:

使用
reduce

boot.user=> (reduce (fn [a b] (+ b (* a 10))) 0 '(1 2 3 4 5))
12345
使用
clojure.string/join
Long/parseLong

boot.user=> (Long/parseLong (clojure.string/join '(1 2 3 4 5)))
12345
请注意,如果任何数字大于9,则这两种方式的行为并不相同

如果需要对Bigint的支持,可以执行以下操作:

boot.user=> (def digits (repeat 100 1))
#'boot.user/digits
boot.user=> digits
(1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
boot.user=> (reduce (fn [a b] (+ b (* a 10))) 0N digits)
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111N
boot.user=> (bigint (clojure.string/join digits))
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111N

此外,还可以选择使用核心库中的
读取字符串
或(为了安全起见)
clojure.edn/read字符串
。这样做的好处是,您不必考虑整数溢出和转换为bigint,reader会为您这样做:

user> (clojure.edn/read-string (apply str [1 2 3 4 5]))
12345

user> (clojure.edn/read-string (apply str (repeat 20 1)))
11111111111111111111N
作为附加功能,它支持每个clojure的数字文字:

浮动:

user> (clojure.edn/read-string (apply str [1 3 \. 2 4]))
13.24
二进制:

user> (clojure.edn/read-string (apply str "2r" [1 1 0 1]))
13
十六进制:

user> (clojure.edn/read-string (apply str "0x" [\f 2 \e 3]))
62179
任意(例如以5为基数):


依此类推。

此外,还可以选择使用
读取字符串
或(为了安全起见)
clojure.edn/read字符串
,这两种方法都来自核心库。这样做的好处是,您不必考虑整数溢出和转换为bigint,reader会为您这样做:

user> (clojure.edn/read-string (apply str [1 2 3 4 5]))
12345

user> (clojure.edn/read-string (apply str (repeat 20 1)))
11111111111111111111N
作为附加功能,它支持每个clojure的数字文字:

浮动:

user> (clojure.edn/read-string (apply str [1 3 \. 2 4]))
13.24
二进制:

user> (clojure.edn/read-string (apply str "2r" [1 1 0 1]))
13
十六进制:

user> (clojure.edn/read-string (apply str "0x" [\f 2 \e 3]))
62179
任意(例如以5为基数):


依此类推。

在哪里定义了
数字
函数?我似乎在任何地方都找不到它。
数字
函数定义在哪里?我好像到处都找不到。