Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 为什么这段代码在没有大括号的情况下仍然有效_Clojure - Fatal编程技术网

Clojure 为什么这段代码在没有大括号的情况下仍然有效

Clojure 为什么这段代码在没有大括号的情况下仍然有效,clojure,Clojure,为什么这个代码可以工作 (defn g [] do (println 10) (println 20)) 注意:没有(在do之前)。理论上这甚至不应该编译。编译器应该抱怨说,do无法解析,因为它是一个特殊符号,不在表单的第一个位置 这是一个(可能是意外的)对do特殊窗体和fn*特殊窗体的主体使用相同语法的结果。编译do特殊窗体时,前导的do被删除,其余的窗体被编译。对函数体使用相同的语法分析器意味着单个裸do也可以首先出现 public static class BodyExpr i

为什么这个代码可以工作

(defn g []
     do (println 10) (println 20))

注意:没有(在do之前)。

理论上这甚至不应该编译。编译器应该抱怨说,
do
无法解析,因为它是一个特殊符号,不在表单的第一个位置

这是一个(可能是意外的)对
do
特殊窗体和
fn*
特殊窗体的主体使用相同语法的结果。编译
do
特殊窗体时,前导的
do
被删除,其余的窗体被编译。对函数体使用相同的语法分析器意味着单个裸
do
也可以首先出现

public static class BodyExpr implements Expr, MaybePrimitiveExpr{

    ...

    public Expr parse(C context, Object frms) {
        ISeq forms = (ISeq) frms;
        if(Util.equals(RT.first(forms), DO))
            forms = RT.next(forms);

    ....
您会注意到,如果重复执行
do
,则

(defn g [] do do (println 10) (println 20))
;=> CompilerException java.lang.RuntimeException: 
      Unable to resolve symbol: do in this context ...

未按预期编译。

谢谢。因此,它被显式编码为异常。知道原因吗?@Tim请参见编辑。这是对
do
特殊形式和函数体特殊形式使用相同解析器的结果(可能是无意的),
fn*
。多么奇怪……我会想到这样的事情:
=>((fn[]println println));#
,但所有特殊表单似乎都存在此例外情况。
((fn[]if))
,例如,抛出相同的RTE。