在Clojure中的列表/序列中添加项目

jav*_*y79 7 clojure

必须有一个简单的方法来做到这一点,我显然想念它:|

如何在clojure中的列表\序列中添加项目(区别不明确)?

我尝试过以下方法:

Clojure> (add [1 2 3])
java.lang.RuntimeException: Unable to resolve symbol: add in this context
Clojure> (+ [1 2 3])
java.lang.ClassCastException: Cannot cast clojure.lang.PersistentVector to java.lang.Number
Clojure> (apply merge-with + [1 2 3])
java.lang.IllegalArgumentException: Don't know how to create ISeq from: java.lang.Long
Clojure> (add-items [1 2 3])
java.lang.RuntimeException: Unable to resolve symbol: add-items in this context
Run Code Online (Sandbox Code Playgroud)

Cra*_*ntz 9

(+ 1 2 3)
Run Code Online (Sandbox Code Playgroud)

...会做的.@Nathan Hughes的解决方案:

(apply + [1 2 3]) 
Run Code Online (Sandbox Code Playgroud)

...如果您对序列有引用而不是内联定义,则有效,例如:

(def s [1 2 3])
; (+ s) CastClassException
(apply + s) ; 6
Run Code Online (Sandbox Code Playgroud)

正如@ 4e6所述,reduce也有效:

(reduce + s) ; 6
Run Code Online (Sandbox Code Playgroud)

哪个更好?意见各不相同.

  • (减少+ [1 2 3])对我来说没有意义,因为+已经使用了减少:https://github.com/richhickey/clojure/blob/a1eff35124b923ef8539a35e7a292813ba54a0e0/src/clj/clojure/core.clj# L797 (2认同)