7

以前行っていた他の言語で、Xの量だけ数値をインクリメントする方法を知りたいです

foo + = 0.1;

しかし、Clojureでそれをどのように行うことができるのかわかりません

4

2 に答える 2

9

Clojureでは変数は不変です。したがって、の値を変更しようとしないでください。foo代わりに、新しいfooを「作成」してください。

(def foo2 (+ foo 0.1))

...または、ループ内の場合は、新しい値で繰り返します。

(loop [foo 5.0]
  (when (< foo 9)
    (recur (+ foo 0.1))))

...または、fooがアトムの場合swap!、新しい値になります。

(def foo (atom 5.0))
(swap! foo (partial + 0.1))

Clojureの理論的根拠を読むことから始めることをお勧めします。

于 2013-03-26T20:59:24.810 に答える
4

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のスレッドマクロで使用されます。

于 2013-03-26T23:54:57.523 に答える