2016-01-23 84 views
2

为什么下面的代码片段不能在控制台打印“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..)这样的语句吗?

回答

0

在您的代码中,您尝试打印(重复1)的结果,这没有意义。我想你大概的意思做(复发1)如果我== 0,并打印我,否则,如下:

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

是的,这是自然而然的做法。我试图弄清楚'(recur ...)是否停止并解除了其父语句的执行。似乎并不是这种情况。 – George

3

正确的,“嵌套易复发声明”没有任何Clojure的方言允许的。评论中描述的替代行为(重复“暂停和解散其父语句的执行”)将作为替代语言设计选择,但可能会更难以阅读。