【问题标题】:Why BENCODE has been used for transporting clojure code to nrepl in CIDER?为什么 BENCODE 被用于将 clojure 代码传输到 CIDER 中的 nrepl?
【发布时间】:2020-04-22 22:52:50
【问题描述】:

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

例如:这是一个哈希图 {"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 世界的新手。这可能是一个愚蠢的问题,但无论如何。

【问题讨论】:

  • 我们的范围明确限于实用问题——这些问题会改变您进行编程实践的方式。 “为什么东西 X 是以 Y 方式设计的?”不会改变您使用 X 的方式,也不会让您修复或避免任何错误——这只是历史记录或好奇心的问题,因此通常被认为是题外话。
  • What is the rationale for closing "why" questions on language design?Meta Stack Overflow。 (当然,这是有线协议设计而不是语言设计,但基本原理是成立的)。
  • 也就是说,只要 bencode 被设计为 DJB 的网络字符串的扩展,您可能会发现阅读后者的基本原理很有用,cr.yp.to/proto/netstrings.txt
  • 您的问题在reddit.com/r/Clojureclojureverse.orgask.clojure.org 等网站上可能会被认为更合适
  • @CharlesDuffy 感谢您的回答。另外,我会注意仅将 StackOverflow 用于指定目的。

标签: clojure cider nrepl


【解决方案1】:

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

写的真好。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-06
      • 2014-10-13
      • 1970-01-01
      • 2016-08-08
      • 1970-01-01
      • 2015-04-28
      • 2011-09-19
      • 2017-11-29
      相关资源
      最近更新 更多