我有:
(defn keep?
(def sum [])
(loop [i 0]
(when (< i 10)
(conj sum 10)
(recur (inc i))))
sum
)
这只是给了我和空矢量,即使我将10加到总和上。这是因为它不在Loop内吗?我将如何实现相同的结果。 (顺便说一句,这个例子是故意简化的)
由于
答案 0 :(得分:4)
=Fields!YourDate.Value
不会修改其参数。事实上,如果不采用邪恶的反射技巧,没有任何东西可以修改向量,它是一个不可变的数据结构。这是Clojure的基本原则之一。
在函数式编程中,我们不是修改数据,而是用另一个不可变值替换它。所以你需要使用dddd,MMMM dd,yyyy
的返回值,否则它实际上是一个noop。
$(":input").mouseenter(function(){
var val = $(this).val();
$(this).attr('title', val);
});
此外,conj
的第二个参数必须始终为矢量。
答案 1 :(得分:3)
conj
不具有破坏性,它不会改变该集合,返回具有指定状态(reference)的新集合。
要获得所需的结果,您可以:
sum
- 表单中定义loop
,如i
已定义,而非使用def
recur (inc i) (conj sum 10)
在每次迭代时将sum
重新绑定到新的,以便状态按照您的预期进行构建when
中的条件不满足,只需从sum
返回loop
,它就会冒出来成为此功能的返回值。呃,when
没有“其他分支”,可能的选择是if
像这样:
(defn keep? []
(loop [i 0
sum []]
(if (< i 10)
(recur (inc i)
(conj sum 10))
sum)))
答案 2 :(得分:1)
为了补充其他答案,我几乎从不使用loop
函数。以下是使用for
函数执行此操作的几种方法:
; return a lazy sequence
(for [i (range 10) ]
i)
;=> (0 1 2 3 4 5 6 7 8 9)
; return a concrete vector
(vec
(for [i (range 10) ]
i))
;=> [0 1 2 3 4 5 6 7 8 9]
; 'into' is very nice for converting one collection into another
(into #{}
(for [i (range 10) ]
i))
;=> #{0 7 1 4 6 3 2 9 5 8} ; hash-set is unique but unordered