clojure有语言规范吗?

clojure有语言规范吗?,clojure,specifications,Clojure,Specifications,clojure有语言规范吗?在EBNF或类似的东西中精确定义词汇语法和语法的东西 我能找到的最接近的东西是,但是它并不完全满足语言规范的要求(尽管它是一个非常棒的资源)。如果没有规范,我们的BDFL有没有提到任何关于规范的计划?没有语言规范。如果将来有什么计划的话,我还没有听说过。这是你可能会找到的最接近官方Clojure EBNF的东西 Eclipse插件中的语法不再被该项目使用,并已从中删除 Clojure.g4,一种ANTLR语法 有关Clojure的最新ANTLR语法,请参阅“为ANTL

clojure有语言规范吗?在EBNF或类似的东西中精确定义词汇语法和语法的东西


我能找到的最接近的东西是,但是它并不完全满足语言规范的要求(尽管它是一个非常棒的资源)。如果没有规范,我们的BDFL有没有提到任何关于规范的计划?

没有语言规范。如果将来有什么计划的话,我还没有听说过。

这是你可能会找到的最接近官方Clojure EBNF的东西

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

Clojure.g4
,一种ANTLR语法 有关Clojure的最新ANTLR语法,请参阅“为ANTLR v4编写的语法”集合中的()
Clojure.g4
体积小,易于阅读,并且在过去已经成功解析过,但这并不保证它能够正确解析所有Clojure代码

Clojure的解析器,
LispReader.java
Clojure语法最具权威性的规范是它本身。Clojure不使用抽象语法,只使用自定义语法分析器,但您可以在仔细研究语法分析器的实现后理解语法。这是Clojure的解析器:()

LispReader.java
使用中其他文件中的一些类,例如,但大部分代码都在该文件中。在
LispReader
中,主要功能是<代码>读取用于忽略空格和逗号。它还检测数字并将解析过程交给用户。对于大多数其他符号,例如
#
读取
对中的对象进行免提解释。您可以从此处开始遵循代码

clojure.tools.reader,一个用clojure编写的解析器
还有一个Clojure重新实现的
LispReader.java
称为。可能比
LispReader
更容易阅读,因为它是在Clojure中,而不是在java中。Clojure.tools.reader有一些,它们大多能够读取为Clojure建议的一些小的额外语法,并更好地处理错误。

让我们来看看吧在出现一两个语法错误时:

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 

很明显,现在使用
clojure.spec
检查核心宏的语法(版本1.10)。如果clojure项目中的clojure有所进展,我们可以期望
spec
将其范围扩展到编译器本身

关键是
spec
具有完整的EBNF功能,因此源代码将包含该语言的完整EBNF。符号说明如下:

序列

序列/向量的规范使用一组标准正则表达式 运算符,具有正则表达式的标准语义:

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中定义和检查宏语法的用法是新的。

先生,你赢了。玩得好……玩得好。BNF只是语法(Clojure几乎没有语法)。它不是语义。有关生成您引用的错误消息的库的详细信息:它是“包含描述Clojure核心宏和函数的规范的Clojure库”。Clojure 1.9+依赖于该库。目前,其所有规范都在中定义。
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