2016-01-23 126 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的方言允許的。評論中描述的替代行爲(重複「暫停和解散其父語句的執行」)將作爲替代語言設計選擇,但可能會更難以閱讀。