我想在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中有完整的不变性......
答案 0 :(得分: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)
答案 1 :(得分:6)
mobyte的回答是正确的,但你是如何用无限懒惰的赔率序列来解决你的问题的? (take 10 (filter odd? (range)))
。也许你不需要国家。