【发布时间】:2010-10-11 00:25:28
【问题描述】:
clojure 有语言规范吗?精确定义 EBNF 中的词汇语法和语法的东西或类似的东西?
我能找到的最接近的东西是clojure website,但这并不完全符合语言规范的要求(尽管它是一个非常棒的资源)。如果没有规范,我们的 BDFL 有没有提到任何计划?
【问题讨论】:
clojure 有语言规范吗?精确定义 EBNF 中的词汇语法和语法的东西或类似的东西?
我能找到的最接近的东西是clojure website,但这并不完全符合语言规范的要求(尽管它是一个非常棒的资源)。如果没有规范,我们的 BDFL 有没有提到任何计划?
【问题讨论】:
Eclipse 插件Counterclockwise 中的语法linked by fogus 不再被该项目使用,并已从其中删除。
Clojure.g4,一个ANTLR语法有关 Clojure 的最新 ANTLR 语法,请参阅来自 grammars-v4 的 Clojure.g4 (permalink),这是“为 ANTLR v4 编写的语法”的集合。 Clojure.g4 小巧易读,过去成功解析过Compojure 和clojure.core,但这并不能保证它能够正确解析所有Clojure 代码。
LispReader.java
Clojure 语法最权威的规范是Clojure’s source code 本身。 Clojure 没有使用抽象语法,只有自定义的解析器,但仔细研究解析器的实现,就能理解语法。这是 Clojure 的解析器:LispReader.java (permalink)。
LispReader.java 使用了the same directory 中其他文件的一些类,例如LineNumberingPushbackReader,但大部分代码都在该文件中。在LispReader中,主要功能是read。 read 使用 isWhitespace 忽略空格和逗号。它还检测数字并将解析交给readNumber。对于大多数其他符号,例如( 和#,read 将解释交给macros and dispatchMacros arrays 中的对象。您可以从那里按照代码进行操作。
还有一个 LispReader.java 的 Clojure 重新实现,称为 clojure.tools.reader。 Its source code 可能比 LispReader 更容易阅读,因为它是在 Clojure 中,而不是在 Java 中。 clojure.tools.reader 有一些differences from LispReader.java,它们主要能够读取为 Clojure 提出的一些额外的小语法并更好地处理错误。
【讨论】:
这是您可能找到的最接近官方 Clojure EBNF 的东西。
【讨论】:
没有语言规范。如果将来有任何计划,我还没有听说过。
【讨论】:
让我们看一两个语法错误:
user=> (defn)
Syntax error macroexpanding clojure.core/defn at (REPL:1:1).
() - failed: Insufficient input at: [:fn-name] spec: :clojure.core.specs.alpha/defn-args
和
user=> (fn [3]) Syntax error macroexpanding clojure.core/fn at (REPL:1:1).
(3) - failed: Extra input at: [:fn-tail :arity-1 :params] spec: :clojure.core.specs.alpha/param-list
3 - failed: vector? at: [:fn-tail :arity-n :params] spec: :clojure.core.specs.alpha/param-list
很明显,现在(1.10 版)使用clojure.spec 检查核心宏的语法。如果Clojure 中的Clojure 项目取得进展,我们可以期待spec 将其范围扩展到适当的编译器。
关键是spec 具有完整的 EBNF 能力,因此源代码将包含该语言的完整 EBNF。符号在Clojure - clojure.spec: Rationale and Overview中解释:
序列
序列/向量的规范使用一组标准正则表达式 运算符,具有正则表达式的标准语义:
cat - a concatenation of predicates/patterns alt - a choice of one among a set of predicates/patterns * - zero or more occurrences of a predicate/pattern + - one or more ? - one or none & - takes a regex op and further constrains it with one or more predicates
什么时候会发生这种情况?我(完全不知情)的印象是,核心团队淹没在鳄鱼中,几乎忘记了他们排干这片沼泽的初衷。
之前关于 Clojure 1.9 的一般术语中提到 spec 的答案已被删除。我认为它用于定义和检查宏语法是 1.10 的新功能。
【讨论】: