【问题标题】:Why does the Clojure reader get confused with keywords containing colons?为什么 Clojure 阅读器会与包含冒号的关键字混淆?
【发布时间】:2015-08-30 17:40:25
【问题描述】:

来自reader docs

关键字就像符号,除了:

它们可以而且必须以冒号开头,例如:弗雷德。

它们不能包含 '.'或命名类。

以两个冒号开头的关键字在当前命名空间中解析

一个符号可以包含一个或多个不重复的':'。

所以看起来文档应该明确允许 :my:keyword 作为关键字。

这适用于我的 REPL:

user=> {:my:keyword 1}
{:my:keyword 1}

这很有效:

user=> {:mykeyword
  #_=> 1}
{:mykeyword 1}

即使这样也有效

=> (clojure.edn/read-string (pr-str {:my:keyword 1}))
{:my:keyword 1}

但这不是:

user=> {
  #_=> :my:keyword

RuntimeException EOF while reading, starting at line 1
clojure.lang.Util.runtimeException (Util.java:221)

我不能在包含冒号的关键字后面紧跟散列图文字的中间添加换行符。

我可以对其他关键字执行此操作。这工作正常。

user=> {
  #_=> :one
  #_=> 1
  #_=> }
{:one 1}

为什么?这只是读者的怪癖吗? AFAICT :my:keyword 是语法上有效的关键字。我应该担心其他不一致吗?

我正在使用

REPL-y 0.3.5,
nREPL 0.2.6
Clojure 1.6.0

【问题讨论】:

  • 可能有助于了解 your repl 有什么。适用于例如java -cp clojure-1.7.0-RC1.jar clojure.main。我用 lein repl (1.6) 得到同样的错误

标签: clojure clojure-repl


【解决方案1】:

正如您最后一个示例所代表的那样,您还没有完成地图,所以我希望它会抛出一个带有:my:keyword 所在的任何值的异常。这对我有用。

{
 :my:keyword 1
 }
=> {:my:keyword 1}

【讨论】:

  • 我的 REPL 不符合您的期望,请参阅最近的编辑。你用的是哪个版本?
  • 你在问题​​中的例子没有关闭地图,你能在地图 } 关闭的情况下再次检查吗?
  • 对不起,我不明白。你是说我遇到问题的例子吗?在这个例子中,在我关闭地图之前抛出异常,这就是我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-28
  • 2010-09-29
  • 1970-01-01
  • 1970-01-01
  • 2021-04-06
  • 1970-01-01
相关资源
最近更新 更多