为什么使用 BENCODE 将 clojure 代码传输到 CIDER 中的 nrepl?

Why BENCODE has been used for transporting clojure code to nrepl in CIDER?

为什么我们不能简单地将 Clojure 代码转换为字符串并通过 TCP 发送它并在另一端计算 (nrepl)?

例如:这是一个 hashmap {"foo" "bar", 1 "spam"},其 BENCODE 编码为 d3:foo3:bari1e4:spame

如果我们将它转​​换为字符串 -> {\"foo\" \"bar\", 1 \"spam\"}

并在另一侧进行评估,而不是使用 BENCODE,如下所示。

(eval (read-string "{\"foo\" \"bar\", 1 \"spam\"}"))
; ⇒ {"foo" "bar", 1 "spam"}

我是 Clojure 世界的新手。这可能是一个愚蠢的问题,但无论如何。

对于寻找答案的人,请阅读 https://github.com/clojure/tools.nrepl/blob/master/src/main/clojure/clojure/tools/nrepl/bencode.clj

中的 # 动机 部分

写的很好

这里是 nREPL 的维护者。 nREPL默认使用bencode的原因有几个:

  • 我们需要一种能够轻松支持数据流的数据格式(您不会找到很多流式 JSON 解析器)
  • 我们需要一种可以很容易地被许多客户端支持的数据格式(对 JSON 和 EDN 等格式的支持在 Emacs 和 vim 等编辑器中很棘手)。我可以告诉你,如果 8 年前我们必须在那里处理 JSON,CIDER 就不会存在。 :-)
  • Bencode 非常简单,通常您甚至不需要依赖第三方库(许多 clients/servers 在不到 100 行的情况下都有自己的 encoding/decoding 实现代码)- 这意味着 clients/servers 少了一个第 3 方库。像 nREPL 这样的工具实际上不能有运行时 deps,因为它们与用户应用程序 deps 冲突。
  • 创建 nREPL 时 EDN 不存在

顺便说一句,现在 nREPL 也支持 EDN 和 JSON(通过 fastlane 库),但我认为在大多数情况下 bencode 仍然是最好的传输方式。