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流与评估分开处理,因为它们可能来自太多的“来源”。
...