1

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

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

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

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

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

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

4

2 回答 2

1

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

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

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

于 2020-05-23T05:48:41.697 回答
0

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

这写得非常好。

于 2020-01-06T13:45:36.697 回答