clojure:如何在if语句中使用recur

时间:2013-09-15 11:04:36

标签: eclipse clojure counterclockwise

免责声明:我正在学习clojure。

这是我试图运行的简单示例:

(ns ClojureTest.core)

(let [input (read-line)]
  ;if user input = "x"
  (if (= "x" input)
    ;stop accepting input
    (println "Exit")
    ;else output the input and continue accepting input
    (
      (println input)
      (recur)
    )
  )
)

现在我收到了这个错误,我觉得这很有道理,因为我不熟悉语法:

Exception in thread "main" java.lang.UnsupportedOperationException: Can only recur from tail position, compiling:(ClojureTest/core.clj:8:7)

我该如何解决这个问题?

附带问题:

  1. 当我在eclipse中点击“run”时(就像我用Java做的那样)我不仅打开了控制台,而且打开了这个“REPL”窗口。为什么它是必要的,它做了什么?
  2. 当我点击“运行”时,启动应用程序需要几秒钟。有没有办法让它更快?
  3. 当我需要编辑代码并重新启动应用程序时,我收到此消息:“无法启动选择,并且最近没有启动”。这是什么,为什么不让我重新启动我的代码?如果我等一会儿,我可以再次启动它。

1 个答案:

答案 0 :(得分:3)

在这种特殊情况下,您在do的“else”子句中错过了if

(do
  (println input)
  (recur))

如果没有do,你就会得到((println input) (recur)),它看起来像一个函数调用,返回值(println input)是要调用的函数,(recur)是参数表达式等等,而不是尾部位置。

(显然(println input)将返回nil并尝试将其作为函数调用将抛出NullPointerException,但这与此无关 - 它将是运行时错误,而recur - 在编译时可以检测到非尾部位置问题。)