我的问题是......更新currentRow nextRow bitPosition的值的好方法是什么 每次(recur [currentRow nextRow bitPosition]))执行。现在我正在努力克服这样一个事实:我不能在clojure中做这样简单的事情。相反,我陷入了这个痛苦的世界,我甚至无法弄清楚如何在循环中将变量设置为新值。
//我希望我能做到这一点
currentRow =(get myVector 0)
//这里是我的代码
(loop [myVector []]
(let [
rule ruleParam
currentRow currentRowParam
nextRow 2r0
bitPosition 2r0
]
(when (bit-test rule (bit-and currentRow 2r111))
(
(bit-shift-right currentRow 1)
(bit-set nextRow 1)
(inc bitPosition)
))
(when (= false (bit-test rule (bit-and currentRow 2r111)) )
(bit-shift-right currentRow 1)
(bit-set nextRow 1)
(inc bitPosition)
)
(recur [currentRow nextRow bitPosition]))
))
(defn firstFunc [[rule currentRowParam]]
(let [currentRowLocal (bit-shift-left currentRowParam 1) nextRowLocal 2r0 bitPositionLocal 0]
(loop [currentRow currentRowLocal nextRow nextRowLocal bitPosition bitPositionLocal]
(if (< bitPosition 31)
(if (bit-test rule (bit-and currentRow 2r111))
(recur
(bit-shift-right currentRow 1)
(bit-set nextRow bitPosition)
(inc bitPosition)
);end recur
(recur
(bit-shift-right currentRow 1)
nextRow
(inc bitPosition)
);end recur
)
;else
nextRow);end if (< bitPosition 31)
);end loop
);end let
);end defn firstFunc
(firstFunc2 [2r1110 2r11])
答案 0 :(得分:4)
简短的回答是,你不能。
例如,你有
(bit-shift-right currentRow 1)
(bit-set nextRow 1)
(inc bitPosition)
这些表达无所作为。我们来看第一个
(bit-shift-right currentRow 1)
此返回 currentRow
的值,右移位1.它不会更改currentRow
。由于您没有对返回的值执行任何操作,因此将其遗忘。
要使用函数返回的值,您可以recur
到loop
,这只是let
recur
。(loop [myVector []]
(loop [rule ruleParam
currentRow currentRowParam
nextRow 2r0
bitPosition 2r0]
(if (bit-test rule (bit-and currentRow 2r111))
(recur
rule
(bit-shift-right currentRow 1)
(bit-set nextRow 1)
(inc bitPosition))
(recur
rule
(bit-shift-right currentRow 1)
(bit-set nextRow 1)
(inc bitPosition)))
(recur rule currentRow nextRow bitPosition)))
。
如果我们相应地重新编写代码,我们会得到类似
的内容if
......补充loop
条件已被省略。
这仍然是无稽之谈。
recur
中的所有最终表达式都是recur
- 所以你永远不会
逃避它。您可能会在4Clojure找到更简单的问题,帮助您掌握语言。