是否有Clojure语言规范?是否有类似EBNF的精确定义词法和语法的规范?
我找到的最接近规范的是Clojure官网,但那并不完全符合语言规范的要求(尽管是一个非常好的资源)。如果没有规范,我们的BDFL是否提到了任何制定规范的计划?
是否有Clojure语言规范?是否有类似EBNF的精确定义词法和语法的规范?
我找到的最接近规范的是Clojure官网,但那并不完全符合语言规范的要求(尽管是一个非常好的资源)。如果没有规范,我们的BDFL是否提到了任何制定规范的计划?
这个句子中提到的语法 linked by fogus 最初是在 Eclipse 插件 Counterclockwise 中使用的,但现在该项目不再使用此语法,并已将其移除。
Clojure.g4
,一个 ANTLR 语法文件如果您需要更加更新的Clojure ANTLR语法,请参考grammars-v4中的Clojure.g4
(permalink),这是一组“为ANTLR v4编写的语法”。Clojure.g4
很小且易于阅读,过去已成功解析了Compojure和clojure.core
,但这并不保证它可以正确解析所有Clojure代码。
LispReader.java
LispReader.java
(permalink)。
LispReader.java
使用了来自相同目录中其他文件的几个类,如 LineNumberingPushbackReader
,但大部分代码都在该文件中。在 LispReader
中,主要函数是read
。 read
使用 isWhitespace
来忽略空格和逗号。它还检测数字并将解析工作交给readNumber
。对于大多数其他符号,例如 (
和 #
,read
将解释转交给macros
和dispatchMacros
数组中的对象。您可以从那里跟进代码。
还有一个Clojure版本的LispReader.java
,叫做clojure.tools.reader。它的源代码可能比LispReader
更容易阅读,因为它是用Clojure而不是Java编写的。clojure.tools.reader与LispReader.java
有一些不同之处, 主要是能够读取一些提出给Clojure的小型额外语法并更好地处理错误。
这是您可能会找到的最接近官方Clojure EBNF。
(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 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
spec
的一般术语的回答被删除了。我认为它在1.10中用于定义和检查宏语法是新的。