Clojure有语言规范吗?

22

是否有Clojure语言规范?是否有类似EBNF的精确定义词法和语法的规范?

我找到的最接近规范的是Clojure官网,但那并不完全符合语言规范的要求(尽管是一个非常好的资源)。如果没有规范,我们的BDFL是否提到了任何制定规范的计划?

4个回答

18

这个句子中提到的语法 linked by fogus 最初是在 Eclipse 插件 Counterclockwise 中使用的,但现在该项目不再使用此语法,并已将其移除。

Clojure.g4,一个 ANTLR 语法文件

如果您需要更加更新的Clojure ANTLR语法,请参考grammars-v4中的Clojure.g4permalink),这是一组“为ANTLR v4编写的语法”。Clojure.g4很小且易于阅读,过去已成功解析了Compojureclojure.core,但这并不保证它可以正确解析所有Clojure代码。

Clojure的解析器,LispReader.java

Clojure语法最权威的规范就是Clojure源代码本身。Clojure没有使用抽象语法,只有一个自定义解析器,但是你可以通过仔细研究解析器的实现来理解语法。这里是Clojure的解析器:LispReader.java (permalink)。

LispReader.java 使用了来自相同目录中其他文件的几个类,如 LineNumberingPushbackReader,但大部分代码都在该文件中。在 LispReader 中,主要函数是readread 使用 isWhitespace 来忽略空格和逗号。它还检测数字并将解析工作交给readNumber。对于大多数其他符号,例如 (#read 将解释转交给macrosdispatchMacros数组中的对象。您可以从那里跟进代码。

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

还有一个Clojure版本的LispReader.java,叫做clojure.tools.reader它的源代码可能比LispReader更容易阅读,因为它是用Clojure而不是Java编写的。clojure.tools.reader与LispReader.java有一些不同之处, 主要是能够读取一些提出给Clojure的小型额外语法并更好地处理错误。


17

你赢了,先生。玩得不错...玩得不错。 - Rayne
1
https://github.com/laurentpetit/ccw/blob/3738a4fd768bcb0399630b7f6a6427a3066bdaa9/clojure-antlr-grammar/src/Clojure.g - w-m
1
BNF只是语法(Clojure几乎没有语法)。它不是语义学。 - jameshfisher

7

目前没有语言规范。如果将来有相关计划,我没有听说过。


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

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

关键是spec具有完整的EBNF功能,因此源代码将包含语言的完整EBNF。符号说明在Clojure - clojure.spec:Rationale and Overview中解释:

Sequences

Specs for sequences/vectors use a set of standard regular expression operators, with the standard semantics of regular expressions:

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

1
关于 core.specs.alpha 的更多信息,这个库生成了你引用的错误消息:“一个 Clojure 库,包含描述 Clojure 核心宏和函数的规范。” Clojure 1.9+ 依赖于该库。目前,所有规范都在src/main/clojure/clojure/core/specs/alpha.clj中定义。 - Rory O'Kane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接