clojure有语言规范吗?

时间:2010-10-11 00:25:29

标签: clojure specifications

是否有针对clojure的语言规范?在EBNF或类似的东西中精确定义词法语法和语法的东西?

我能找到的最接近的是clojure website,但这并不完全符合语言规范的要求(尽管它是一个非常好的资源)。如果没有规格,我们的BDFL是否提到过任何一个计划?

4 个答案:

答案 0 :(得分:16)

Eclipse插件linked by fogus中的语法Counterclockwise不再被该项目使用,并已从中删除。

Clojure.g4,一个ANTLR语法

有关Clojure的更新的ANTLR语法,请参阅Clojure.g4中的 permalink grammars-v4),这是一组“为ANTLR v4“。 Clojure.g4很小且易于阅读,并且过去已成功解析Compojureclojure.core,但这并不能保证它可以正确解析所有Clojure代码。

Clojure的解析器,LispReader.java

Clojure语法的最具说服力的规范是Clojure’s source code本身。 Clojure不使用抽象语法,只使用自定义解析器,但在仔细研究解析器的实现后,您可以理解语法。这是Clojure的解析器: LispReader.java permalink)。

LispReader.java使用the same directory中其他文件中的一些类,例如LineNumberingPushbackReader,但大部分代码都在该文件中。在LispReader中,主要功能是readread使用isWhitespace来忽略空格和逗号。它还会检测数字并将解析移交给readNumber。对于大多数其他符号,例如(#read会将解释移交给macros and dispatchMacros arrays中的对象。你可以从那里按照代码。

clojure.tools.reader,一个用Clojure编写的解析器

还有LispReader.java的Clojure重新实现,名为 clojure.tools.reader Its source code可能比LispReader更容易阅读,因为它是在Clojure中,而不是Java。 clojure.tools.reader有一些differences from LispReader.java,它们大多能够读取为Clojure提出的一些小额外语法并更好地处理错误。

答案 1 :(得分:15)

答案 2 :(得分:6)

没有语言规范。如果将来有任何计划,我还没有听说过。

答案 3 :(得分:0)

让我们看看一个或两个语法错误:

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

很明显,现在使用clojure.spec检查了核心宏的语法(版本1.10)。如果 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中是用于定义和检查宏语法的新功能。