3

Clojure でクロージャーを作成して、次の JavaScript コードをシミュレートしたいと考えています。

var nextOdd = function () {
    var x = 1;
    return function () {
        var result = x;
        x += 2;
        return result;
    }
}();
nextOdd(); //1
nextOdd(); //3
nextOdd(); //5

Clojure がクロージャーをサポートしていることを知っているので、次のようなものを書くことができる可能性があります

(defn plusn [x]
    (fn [y] (+ x y)))
(def plus2 (plusn 2))
(plus2 3)

しかし、関数を呼び出すたびに状態 (つまり、次の奇数の状態) を維持するものが必要です...そして、Clojure には不変性全体があります...

4

2 に答える 2

9

これは clojure で同等です

(def next-odd (let [x (atom -1)]
                (fn []
                  (swap! x + 2))))

(next-odd)
-> 1
(next-odd)
-> 3
(next-odd)
-> 5
(next-odd)
...

奇数シーケンスが必要な場合は、dAni の例に追加します。

(def odd-numbers (iterate (partial + 2) 1))

(take 5 odd-numbers)
-> (1 3 5 7 9)
于 2012-12-09T02:27:47.530 に答える
6

mobyte の答えは正しいですが、オッズの無限の遅延シーケンスで問題をどのように解決しようとしましたか? (take 10 (filter odd? (range))). おそらく、状態は必要ありません。

于 2012-12-09T02:34:31.513 に答える