为什么下面的代码片段不能在控制台打印“1”?嵌套的重复陈述
(loop
[i 0]
(println (if (= i 0) (recur 1) i)))
而是在REPL中抛出clojure.lang.ExceptionInfo: Can't recur here at line 3
。 Clojure(Script)中不允许嵌套(recur..)
这样的语句吗?
为什么下面的代码片段不能在控制台打印“1”?嵌套的重复陈述
(loop
[i 0]
(println (if (= i 0) (recur 1) i)))
而是在REPL中抛出clojure.lang.ExceptionInfo: Can't recur here at line 3
。 Clojure(Script)中不允许嵌套(recur..)
这样的语句吗?
在您的代码中,您尝试打印(重复1)的结果,这没有意义。我想你大概的意思做(复发1)如果我== 0,并打印我,否则,如下:
(loop [i 0]
(if (= i 0) (recur 1) (println i)))
正确的,“嵌套易复发声明”没有任何Clojure的方言允许的。评论中描述的替代行为(重复“暂停和解散其父语句的执行”)将作为替代语言设计选择,但可能会更难以阅读。
请参阅Clojure: What exactly is tail position for recur? - 您只能在Clojure的“尾部位置”使用recur
。在这种情况下,recur
不在尾部位置,因为它不是最后一个要在此功能中评估的事物 - 在调用recur
之后将评估println
。
是的,这是自然而然的做法。我试图弄清楚'(recur ...)是否停止并解除了其父语句的执行。似乎并不是这种情况。 – George