如果 - 然后呢?

时间:2011-12-24 03:54:48

标签: if-statement clojure

这应该是一个非常微不足道的问题。 我是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))
     )

     )
) 

3 个答案:

答案 0 :(得分:15)

在模板中:

(if test then else?)

thenelse都不代表关键字,而是实际表达式。 ?表示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。