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。