在clojure中等价于+ =运算符

时间:2017-06-24 13:49:35

标签: clojure

将这个c ++代码翻译成clojure的最正确方法是什么?

代码示例:if((J%2) == 0) {det += src[0][J]*calcDet( min, ord-1)};}

2 个答案:

答案 0 :(得分:4)

使用C ++代码,$options的值正在改变。这里返回了det的新值:

det

从代码中删除可变性最正确

(fn [calcDet src ord min det J] (if (zero? (mod J 2)) (+ det (* (nth (nth src 0) J) (calcDet min (dec ord)))) det)) J似乎是唯一正在改变的变量,因此我将它们作为最后两个参数放在一起。您可能希望det超过reduce的值,其中J是累加器,在这种情况下使用det来获取一个函数,该函数仍然是最后两个args提供。

或者你可以partial通过类似的函数,生成一个新状态的惰性列表,其中每个状态都是iterate

Clojure中没有等同于[J det]的内容。

答案 1 :(得分:0)

好吧,要添加到det的计算表达式如下所示:

(* (get-in src [0 J]) (calcDet min (dec ord)))

您的if,假设没有别的,看起来像这样:

(when (even? J)
   ... do something)

if分支else如下:

(if (even? J)
  ... do something
  ... otherwise, do something else)

要添加数字,请执行以下操作:

(+ 1 2 3)

然而,当涉及+= ...

思考语法意味着考虑评估表达。价值观不可改变。您 想要做什么,而不是更改 det?好吧,您想要计算一些值,以添加到您当前绑定到名称det的任何值。然后,您可以将结果绑定到名称,也可以将其提供给另一个表达式。没有州,只是评估表达。

话虽如此,没有更大的背景,想到“等价”是毫无意义的,因为问题的整体方法会有所不同。

循环,索引数组和就地变异都是代码段的所有功能。虽然这些与现代硬件架构(又名“计算机说话”)一致,但它们有时与人类大脑自然处理问题的方式不一致。因此,除此之外的抽象层次通常允许我们“缩小”并整体查看问题,如果给定工具,我们经常会找到更简洁的解决方案。

因此,在不知道此代码的上下文的情况下,没有“等效”,至少不是惯用的。我特别没有提到原子,它是clojure保持和改变状态的机制之一,因为它们肯定不适用于这段代码。