在Clojure中我相当于I ++

时间:2010-12-22 19:46:57

标签: clojure

我是Clojure的新手。

在Clojure中是否有增加变量的快捷方式?

在许多语言中都可以使用:

i++;
i += 1;

在Clojure中,我可以这样做:

(def i 1)    
(def i (+ i 1))

这是在Clojure中增加绑定的正确方法吗?

有没有快捷方式?

3 个答案:

答案 0 :(得分:17)

您可以编写(inc i)来增加整数或长整数。

(def i 1)
(def i+1 (inc i))

如果您需要将(inc i)分配给i本身,请告诉您为什么要这样做。在大多数情况下,clojure中会有更优雅(或惯用)的解决方案。

答案 1 :(得分:11)

您可以使用原子并交换其值


(let [i (atom 0)]
  (println @i)
  (swap! i inc)
  (println @i))

会给你

0
1

答案 2 :(得分:5)

你无法为clojure或任何其他lisp分配i新值,因为它很重要。 i在当前上下文中将只有一个值。 (inc i)返回一个新值,该值可能会或可能不会绑定到新的局部变量。

这就是为什么在lisp语言中,尾递归优化如此重要;因为模拟循环的唯一方法是使用递归,在每次函数调用时,索引都有一个新值。尾递归优化通过转换平坦的旧循环中的递归来避免人们用一个非常长的循环来耗尽堆栈

clojure保证通过使用recur函数再次调用相同的函数来实现尾递归优化。如果无法进行尾递归优化,recur将产生编译时错误

编辑这是无法解释成语的本质。在inmutability和功能风格的编程之间有很强的联系。原因是函数式编程意味着“没有副作用的代码”,或者确切地说,函数在计算中的唯一影响是通过其返回值。实现这一目标的一种方法是默认在上面的意义上使参数和变量不可变。虽然到目前为止,从其他海报中你已经意识到有很多方法可以解决这个问题,而不是依赖于clojure中的不可改变性