ClassCastException java.lang.Long不能强制转换为clojure.lang.IFn

ClassCastException java.lang.Long不能强制转换为clojure.lang.IFn,clojure,Clojure,我有一个函数,它取年数和工资,然后递归地加倍工资,直到年数用完为止。然而,我不断地发现这个错误: ClassCastException java.lang.Long不能强制转换为clojure.lang.IFn 代码 (defn calculate-salary [years salary] (if (= years 0) (salary) (calculate-salary (- years 1) (* salary 2)))) 我对Cloju

我有一个函数,它取年数和工资,然后递归地加倍工资,直到年数用完为止。然而,我不断地发现这个错误:

ClassCastException java.lang.Long不能强制转换为clojure.lang.IFn

代码

(defn calculate-salary
    [years salary]
    (if (= years 0)
        (salary)
        (calculate-salary (- years 1) (* salary 2))))

我对Clojure很陌生,所以我相信这很简单,但我就是想不出来。

在你的if条件下,你需要去掉
工资
周围的括号:

(if (= years 0)
        salary
        (calculate-salary (- years 1) (* salary 2))
表单
(f arg1 arg2..
尝试将
f
作为函数调用,并将
arg1、arg2..
作为参数。因此,
(salary)
尝试将
salary
(a long)作为一个没有参数的函数调用,因此出现错误。

(salary)
是一个函数调用,但
salary
不是一个函数,而是一个数字

解决方法是不要将其括在括号中:

(if (= years 0) salary (calculate-salary (- years 1) (* salary 2)))

错误的含义应该不太难分辨:在需要函数的地方使用了一个数字


Clojure中的括号不是分组构造,它们主要用于调用函数调用。如果您将
(salary)
更改为
salary
,您将返回该数字,而不是尝试将其作为无参数函数调用。

由于您是新手,我将您的函数改写为更为惯用的函数。此外,它使用recur,因此不会占用调用堆栈

(defn calculate-salary
  [years salary]
  (if (zero? years)
    salary
    (recur (dec years) (* salary 2))))
注意零的用法了吗?谓词、递归和dec

编辑:
拼写错误和语法正确。我需要把自己从我必须继承的遗产中解放出来!啊哈,谢谢你的解释。我也不清楚括号的意思。作为旁注,我也犯了同样的错误,因为我写了
(反复(阅读))
,而不是
(反复阅读)
。公平地说,下面的每个人都回答正确,但我只能将其中一个标记为已接受。