在 clojure 中相当于 += 运算符



将此 C++ 代码转换为 clojure 的最正确方法是什么?

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

使用C++代码,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))

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

Jdet似乎是唯一正在变化的变量,所以我将它们放在一起作为最后两个参数。您可能希望reduceJ的值,其中det是累加器,在这种情况下,使用partial来获取一个尚未提供最后两个参数的函数。

或者,您可以iterate类似的函数,生成新状态的惰性列表,其中每个状态都[J det]

在Clojure中没有等同于+=

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

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

你的if,假设没有其他,看起来像这样:

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

具有else分支的if如下所示:

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

要对数字求加,您需要:

(+ 1 2 3)

但是,当涉及到+=...

从语言上思考意味着思考评估表达。值不可更改。与其改变det,不如说你真正想做什么?好吧,您想计算一些值以添加到您当前绑定到名称的任何值det.然后,可以将该结果绑定到名称,也可以将其馈送到另一个表达式中。没有状态,只是计算表达式。

话虽如此,如果没有更大的背景,考虑"等价物"是没有意义的,因为解决问题的整个方法会有所不同。

循环、索引数组和就地更改都是代码段的功能。虽然这些与现代硬件架构(又名"计算机说话")一致,但它们有时与我们人类大脑自然处理问题的方式不一致。因此,在此之上的抽象级别通常允许我们"缩小"并将问题视为一个整体,如果提供工具,我们通常会找到一个更简洁的解决方案。

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

最新更新