爲什麼下面的代碼片段不能在控制檯打印「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