首先,《defn》(以及《def》)始终产生全局、顶级的将名称绑定到值的绑定,您不应该在另一个《defn》(或《def》)中使用它们。
其次,您有
(
(defn fib_iter ...)
(fib_iter ...)
)
括号( .. )
用于表示函数调用,因此第一个元素(即(defn .. )
形式)是一个函数,随后调用这个函数,其参数是第二个元素(即(fib_iter .. )
形式)。但是,fib_iter
声明的功能需要三个参数(i
、fibi_n_prev
和fibi_n
),而您实际上只传了一个参数。
您应该使用let
进行局部绑定,因此您可以这样写:(let [fib_iter (fn [i fibi_n_prev fibi_n] .. )] (fib_iter 1 0 1))
。您会发现这将工作。