免责声明:我正在学习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)
我该如何解决这个问题?
附带问题:
答案 0 :(得分:3)
在这种特殊情况下,您在do
的“else”子句中错过了if
:
(do
(println input)
(recur))
如果没有do
,你就会得到((println input) (recur))
,它看起来像一个函数调用,返回值(println input)
是要调用的函数,(recur)
是参数表达式等等,而不是尾部位置。
(显然(println input)
将返回nil
并尝试将其作为函数调用将抛出NullPointerException
,但这与此无关 - 它将是运行时错误,而recur
- 在编译时可以检测到非尾部位置问题。)