2024 Clojure状态调查!上分享您的想法。

欢迎!请查看关于页面以获取更多关于这些内容的信息。

+1投票
REPL

假设有一个评估此表达式的pREPL客户端

(do
    (-> (bound-fn []
          (dotimes [_ 4]
            (Thread/sleep 100)
            (println 1)))
        Thread.
        (doto .start))

    1)

输出将是正确的

{:tag :ret, :val 1, :ns user, :ms 4, :form (do
        (-> (bound-fn []
              (dotimes [_ 4]
                (Thread/sleep 100)
                (println 1)))
            Thread.
            (doto .start))

        1)}
{:tag :out, :val 1
}
{:tag :out, :val 1
}
{:tag :out, :val 1
}
{:tag :out, :val 1
}

现在的问题是,来自线程的输出可能会在任意时间打印出来,可能是一分钟之后。

在这段时间里,许多其他pREPL请求可能已经被处理。

因此,在没有ID的情况下,如{:tag :out, :val 1}的消息缺乏足够的上下文来跟踪其来源。

添加ID是个好主意吗?

1 答案

0投票

输出和错误是流,并且与任何特定请求无关 - 没有普遍的方法来关联这些,因此这似乎不是一个好主意。

从技术上讲,可以为每次eval创建一个新的*out>绑定以携带该ID。对于CLJ至少,由于CLJS的异步性质,这不会带来很多好处。我同意,对我来说最好是将out/err流视为与评估分开处理,因为它们可能来自很多“来源”。
...