2014-10-19 58 views
1

我的问题是...什么是更新currentRow nextRow bitPosition 的值每次(recur [currentRow nextRow bitPosition]))执行的好方法。现在我正在为这样一个事实而苦苦挣扎,即我不能在clojure中这样做简单的事情。相反,我被困在这个痛苦的世界里,我甚至无法弄清楚如何在循环中设置一个变量为一个新值。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

其中ruleParam和currentRowParam来自哪里?在循环内的let内绑定它们很愚蠢,在循环运行时它们不能被改变 – noisesmith 2014-10-19 15:24:59

+0

没关系,我从你最后的再次调用中计算出来 – noisesmith 2014-10-19 15:29:01

回答

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永远不会到达,因为其中一个上面的 总是制定。

您可能会发现在4Clojure帮助更容易的问题,你去用语言交手。