gpt4 book ai didi

clojure - clojure 中惯用的惰性原子

转载 作者:行者123 更新时间:2023-12-02 06:42:00 27 4
gpt4 key购买 nike

我在 clojure 中玩了一下原子。我有一个atom指向一个lazy-seq。在另一段代码中,我想将原子的值更新为对序列执行 next 的结果,但考虑到 swap!reset! 返回更新后的值执行永远不会结束。我发现我总是可以将对 swap!reset! 的调用包装在 do 语句中,然后返回 nil,但我想知道这是多么惯用的做法,或者是否有其他解决方案可以做到这一点。

不终止:

(def x (atom (range)))
(swap! x next)

终止

(def x (atom (range)))
(do (swap! x next) nil)
(first @x) ;1
(do (swap! x next) nil)
(first @x) ;2

最佳答案

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

关于“执行此操作的惯用方法是什么”主题,我会给您两个选择:

  1. 将对 swap! 的调用包装在返回某些内容的函数中不同。
  2. 或者,在上面的用例中,在原子中放入一个整数,然后使用 (swap!x
    inc)
    获取下一个整数。

关于clojure - clojure 中惯用的惰性原子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29898863/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com