2017-04-27 148 views
0

我写了这个“码”,显示问题,因为实际的代码是相当大的避免使用全局变量在这种情况下

(defn add-list 
    ([number] 

    (def used [number]) 
    (add-list number used)) 

    ([number used] 

    ;Add elements to used 
    ;Process the elements in used 
    ;Find the next number 

    (add-list number used) 
    )) 

我需要,我可以在FN访问向量将允许我处理矢量内的项目,然后将输出添加到矢量,以便旧项目和新项目在此矢量中进行下一个循环。

我通过定义添加列表函数上方的矢量得到了它的工作,但是如果我第二次在repl上运行该程序,矢量不会被清除。它还表示这个矢量有时不受限制。

+0

您需要更具体地了解代码需要做什么。您可能还希望查看用于累积结果的'reduce'函数:https://clojuredocs.org/clojure.core/reduce –

+0

我不添加数字我只是试图将一个项目向量传递到此循环中将根据当前内容添加到矢量中。 – MDubzem

+0

我一直在使用上述风格不可靠地工作,但我得到这样的错误:IllegalArgumentException不知道如何创建ISeq:clojure.lang.Var $ Unbound – MDubzem

回答

1

reduce功能可以用来累积结果列表,而不仅仅是值求和:

(defn accum-reverse 
    [cum-state curr-val] 
    (cons curr-val cum-state)) 

(println 
    (reduce accum-reverse 
    []    ; initial value of cum-state 
    [1 2 3 4 5]  ; fed into curr-val one at a time 
)) 

;=> (5 4 3 2 1) 

功能accum-reverse被称为5倍。第一次cum-state[]的初始值,即空向量。随后的每个时间cum-state都设置为从accum-reverse开始的返回值。

除了在线文档,您还可以从Clojure for the Brave & True得到一些很好的信息。它大部分是在线的,但它也值得购买。

+0

谢谢。我目前遇到的问题是我试图从循环中更新向量中的数据,但循环没有在下面的循环中获取更新后的数据只有初始数据。我知道我正在更新它,向量是在循环外部定义的 – MDubzem

+0

我似乎找不到一种方法来给每个递归循环提供最新数据 – MDubzem

+0

也许值得注意的是'accum-reverse'很像'conj',如果使用'()'作为初始值而不是'[]'。 – amalloy