首先,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))》并且您会发现这将有效。