clojure在返回向量的循环函数中赋值变量

时间:2014-10-19 05:52:20

标签: clojure

我的问题是......更新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])

1 个答案:

答案 0 :(得分:4)

简短的回答是,你不能。

  • 本地“变量”仅在数学意义上是可变的:您可以考虑 当他们采用不同的值时会显示什么,但你不能为他们分配值。
  • 功能不会更改本地。

例如,你有

   (bit-shift-right currentRow 1)
   (bit-set nextRow 1)
   (inc bitPosition)

这些表达无所作为。我们来看第一个

       (bit-shift-right currentRow 1)

返回 currentRow的值,右移位1.它不会更改currentRow。由于您没有对返回的值执行任何操作,因此将其遗忘。

要使用函数返回的值,您可以recurloop,这只是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 - 所以你永远不会 逃避它。
  • 永远不会达到最后的{{1}},作为上面两个中的一个 总是颁布。

您可能会在4Clojure找到更简单的问题,帮助您掌握语言。