如何在Clojure中增加一个数字?

如何在Clojure中增加一个数字?,clojure,Clojure,我想知道在我以前使用的其他语言中,如何以X的数量递增一个数字 foo+=0.1 但我不知道如何在Clojure中实现它变量在Clojure中是不变的。因此,您不应该尝试更改foo的值,而是“创建”一个新的foo: (def foo2 (+ foo 0.1)) …或者,如果在循环中,则使用新值重复出现: (loop [foo 5.0] (when (< foo 9) (recur (+ foo 0.1)))) (def foo (atom 5.0)) (swap! foo (

我想知道在我以前使用的其他语言中,如何以X的数量递增一个数字

foo+=0.1


但我不知道如何在Clojure中实现它

变量在Clojure中是不变的。因此,您不应该尝试更改
foo
的值,而是“创建”一个新的foo:

(def foo2 (+ foo 0.1))
…或者,如果在循环中,则使用新值重复出现:

(loop [foo 5.0]
  (when (< foo 9)
    (recur (+ foo 0.1))))
(def foo (atom 5.0))
(swap! foo (partial + 0.1))

我建议您从阅读开始。

Blacksad的答案涵盖了定义变量,因此我只想添加其他作用域,您可能希望在其中有一个值从另一个值递增:

在函数的本地范围内:

user> (defn my-function [x]
        (let [y (inc x)
              z (+ x y)]
          [x y z]))
#'user/my-function
user> (my-function 4)
[4 5 9]
如果您希望以增量方式构建一个值,以使流程更加清晰:

user> (defn my-function [x]
        (let [y (inc x)
               z (+ x y)
               z (+ z 4)
               z (* z z)]
          [x y z]))
#'user/my-function
user> (my-function 4)
[4 5 169]

这可以使过程更具表现力,尽管它不是“获取变量的方法”,并且只在有限的上下文中有用。此模式用于clojure.core的线程宏

let是一个宏,它生成一个调用let*,将变量显示为创建新值的唯一方法,这是一种误导——在大多数情况下,当一个人想用另一个值替换一个值时,它们是错误的工具。原子、环等可能在示例中占据更突出的位置。接受函数和参数来进行更新,因此您可以这样编写它,而不是使用
partial
(swap!foo+0.1)