从循环内附加到clojure向量

时间:2015-06-18 10:04:57

标签: clojure

我有:

(defn keep?

   (def sum [])
     (loop [i 0]
        (when (< i 10)
           (conj sum 10)
           (recur (inc i))))
     sum
   )

这只是给了我和空矢量,即使我将10加到总和上。这是因为它不在Loop内吗?我将如何实现相同的结果。 (顺便说一句,这个例子是故意简化的)

由于

3 个答案:

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