【问题标题】:Atomically swap an atom that stores an infinite lazy seq原子交换存储无限惰性序列的原子
【发布时间】:2018-12-01 15:39:27
【问题描述】:

要么我已经筋疲力尽,无法正确思考,要么这是不可能的,但我想swap! 一个指向无限惰性序列的原子,其序列的rest 是目前在里面

我的程序挂起的原因很明显,因为compare-and-set! 尝试在交换之前检查以前的和新的 seq 是否相等。相等性检查基本上永远不会终止

关于如何实现这一点的任何线索?

(def  beyond-infinity (atom (repeat 1)))
(defn keep-pulling [] (swap! beyond-infinity #(rest %)))

编辑

以前我的惰性序列是range,它在其中工作,但在 REPL 上由于实现了返回的序列,我的 REPL 被挂起

无论如何,repeat 仍然失败

【问题讨论】:

  • 对我来说,它与repeatrange 一样好用,尽管range 我至少可以检查第一个元素,看看它在做什么——在任何情况下情况下,我将它挂在repeat 上没有任何问题(在repl 中我正在做(do (keep-pulling) nil) 以避免您提到的问题)。
  • @jas 我的错是 REPL 导致了问题

标签: clojure lazy-evaluation


【解决方案1】:

问题是因为我的 REPL 试图实现一个无限序列。 我提到的关于compare-and-set! 对 seq 进行相等性检查的事情也是错误的。 compare-and-set! 进行引用相等测试,而不是值!

【讨论】:

    猜你喜欢
    • 2014-08-27
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 2014-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多