【问题标题】:Is there a language spec for clojure?clojure 有语言规范吗?
【发布时间】:2010-10-11 00:25:28
【问题描述】:

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

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

【问题讨论】:

    标签: clojure specifications


    【解决方案1】:

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

    Clojure.g4,一个ANTLR语法

    有关 Clojure 的最新 ANTLR 语法,请参阅来自 grammars-v4Clojure.g4 (permalink),这是“为 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.readerIts source code 可能比 LispReader 更容易阅读,因为它是在 Clojure 中,而不是在 Java 中。 clojure.tools.reader 有一些differences from LispReader.java,它们主要能够读取为 Clojure 提出的一些额外的小语法并更好地处理错误。

    【讨论】:

      【解决方案2】:

      【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        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 的新功能。

        【讨论】: