clojure中的惯用惰性原子

ema*_*cas 4 atomic clojure lazy-sequences

我正在玩clojure中的原子.我atom指着一个lazy-seq.在另一个代码位我想更新原子做的结果值next的序列,但考虑到两者swap!reset!返回更新后的值执行永远不会结束.我想通了,我总能包裹调用swap!,reset!在do语句,然后返回nil,但我想知道如何惯用这是或者是否有一个替代的解决方案做到这一点.

不终止:

(def x (atom (range)))
(swap! x next)
Run Code Online (Sandbox Code Playgroud)

终止

(def x (atom (range)))
(do (swap! x next) nil)
(first @x) ;1
(do (swap! x next) nil)
(first @x) ;2
Run Code Online (Sandbox Code Playgroud)

Tim*_*dge 8

这里的问题不是Clojure,而是你正在使用的repl.调用swap!正常工作,就是repl正在尝试打印出结果而不能,因为序列永远不会结束.您可以设置Clojure内置repl通过打印的项目数(set! *print-length* 10).但是,如果您有其他执行不同打印逻辑的REPL中间件,这并不总是有效.

关于"这样做的惯用方法是什么"的话题,我给你两个选择:

  1. 将您的调用包含swap!在返回不同内容的函数中.
  2. 或者,在上面的用例中,在atom中放入一个整数然后(swap! x inc)用来获取下一个整数.