Clojure 嵌套递归语句

Clojure 嵌套递归语句,clojure,clojurescript,Clojure,Clojurescript,为什么下面的代码片段不将“1”打印到控制台 (loop [i 0] (println (if (= i 0) (recur 1) i))) 相反,它抛出clojure.lang.ExceptionInfo:不能在REPL中的第3行再次出现。Clojure(脚本)中不允许使用嵌套的(recur..)语句吗?在代码中,您试图打印(recur 1)的结果,这是没有意义的。我想如果I==0,您可能打算执行(重现1),否则打印I,如下所示: (loop [i 0] (if (= i 0)

为什么下面的代码片段不将“1”打印到控制台

(loop
  [i 0]
  (println (if (= i 0) (recur 1) i)))

相反,它抛出
clojure.lang.ExceptionInfo:不能在REPL中的第3行再次出现。Clojure(脚本)中不允许使用嵌套的
(recur..)
语句吗?

在代码中,您试图打印(recur 1)的结果,这是没有意义的。我想如果I==0,您可能打算执行(重现1),否则打印I,如下所示:

(loop [i 0]
   (if (= i 0) (recur 1) (println i)))

正确,任何Clojure方言中都不允许使用“嵌套的重复语句”。注释中描述的替代行为(recur“停止并撤销其父语句的执行”)将作为替代语言设计选择,但可能更容易混淆。

请参见-您只能从Clojure中的“尾部位置”使用
recur
。在这种情况下,
recur
不处于尾部位置,因为它不是此函数中要计算的最后一项-调用
recur
后将计算
println

是的,这是执行此操作的自然方式。我试图弄清楚
(recur…
是否停止并取消其父语句的执行。情况似乎并非如此。