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 回答