0

免责声明:我正在学习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 中单击“运行”时(就像使用 Java 一样),我不仅打开了控制台,还打开了这个“REPL”窗口。为什么它是必要的,它有什么作用?
  2. 当我单击“运行”时,启动应用程序需要几秒钟。有没有办法让它更快?
  3. 当我需要编辑代码并重新启动应用程序时,我收到以下消息:“无法启动选择,并且最近没有启动”。那是什么,为什么它不让我重新启动我的代码?如果我等待一段时间,我可以再次启动它。
4

1 回答 1

3

在这种特殊情况下,您do在 的“else”子句中缺少 a if

(do
  (println input)
  (recur))

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

(显然(println input)会返回nil并尝试将其作为函数调用会抛出 a NullPointerException,但这在这里无关紧要——这将是一个运行时错误,而recur-not-in-tail-position 问题在编译时是可以检测到的。)

于 2013-09-15T11:12:31.033 回答