为什么循环语句的绑定向量数量是奇数?

oct*_*bus 0 clojure

我一直在查看示例和文档;我不明白为什么我会得到

loop requires an even number of forms in binding vector错误。

我相信问题出在循环和初始化使用索引中。我只是不明白我做错了什么。

(def usage-vec-len 13)

(defn ret-usage-indicies
"Takes a billed water consumption amount, and returns a vector of the ranges."
[reading]
(let [usage-indicies [0 0 0 0 0 0 0 0 0 0 0 0 0] curr-idx (- usage-vec-len 1)]
 (loop [curr-reading reading ui usage-indicies curr-idx]
.
.
.
 (if (= remaining-reading 0)
 ui
 (recur remaining-reading (assoc ui curr-idx curr-reading) (dec curr-idx)))))))
Run Code Online (Sandbox Code Playgroud)

A. *_*ebb 5

表单loop应该看起来就像let表单一样。为了清楚起见,您可以添加逗号空格:

(loop [symbol1 init1, symbol2 init2, ...] body-of-expressions)
Run Code Online (Sandbox Code Playgroud)

看起来你可能想要

(loop [curr-reading reading, ui usage-indicies, curr-idx curr-idx] ...)
Run Code Online (Sandbox Code Playgroud)

其中curr-index被初始化(反弹)为curr-index来自let表达式。

更好的是,您可以将表单中进行的初始化let移至loop表单本身。它看起来也好像usage-vec-len只是countof ,所以当您也可以在循环绑定中处理它时,usage-indices无需在全局中指定它。def

(loop [curr-reading reading
       ui [0 0 0 0 0 0 0 0 0 0 0 0 0]
       curr-idx (dec (count ui))] 
   body-of-expressions)
Run Code Online (Sandbox Code Playgroud)