这应该是一个非常微不足道的问题。 我是Clojure的新手,并根据以下内容撰写此if-then-else:http://clojure.org/special_forms#Special%20Forms--%28if%20test%20then%20else?%29
但是,我一直收到这个错误:
java.lang.Exception:if的参数太多(NO_SOURCE_FILE:424)
// This code has infinite recursion bugs; but it should compile!
(defn sumdown [sum x]
(
if (foo x)
(do
(recur (+ sum x) (dec x))
)
else do(
(recur (+ sum x) (dec x))
)
)
)
答案 0 :(得分:15)
在模板中:
(if test then else?)
then
和else
都不代表关键字,而是实际表达式。 ?
表示else
表达式是可选的。
评估测试条件,并根据其值,评估相应的分支表达式并将其“返回”为整个if表达式的值。
例如,这将定义一个绝对值函数:
(defn abs [x]
(if (< x 0)
(- x)
x))
答案 1 :(得分:7)
(defn sumdown [sum x]
(if (foo x)
(recur (+ sum x) (dec x))
(recur (+ sum x) (dec x))))
这是编写此代码的惯用方法。我推荐一个文本编辑器/ IDE,它基本支持编辑Lisp源代码(paren / bracket / brace匹配)。
答案 2 :(得分:1)
正确实现样本,删除所有冗余代码,将是:
(defn sumdown
[sum x]
(recur (+ sum x) (dec x)))
因为你的'then'和'else'条款都是相同的,'do'是多余的(在任何情况下,各种'do'形式都是副作用)。
其他需要考虑的条件是:何时,cond,condp和case。