2011-12-02 41 views
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 
+2

你是指'(apply + [1 2 3])''? –

+0

是的,@NathanHughes--这就是我一直在寻找的东西。我不知道为什么我不能想出如此简单的东西,但是 - 是的 - 就是这样。 – javamonkey79

回答

9
(+ 1 2 3) 

...将做到这一点。 @Nathan休斯的解决方案:

(apply + [1 2 3]) 

...作品,如果你有顺序的参考,而不是行内定义它,如:

(def s [1 2 3]) 
; (+ s) CastClassException 
(apply + s) ; 6 

正如@ 4E6笔记,reduce也可以工作:

(reduce + s) ; 6 

哪个更好? Opinions vary

+1

我相信'(减少+ [1 2 3])'更加地道。 – 4e6

+0

@ 4e6:[你可能是对的。](http://stackoverflow.com/questions/3153396/clojure-reduce-vs-apply) –

+0

'apply +'作品,谢谢。 – javamonkey79