我正在尝试编写一个在 Clojure 中返回记忆递归函数的函数,但我无法让递归函数看到它自己的记忆绑定。这是因为没有创建 var 吗?另外,为什么我不能在用 let 创建的本地绑定上使用 memoize?
这个从特定数字开始的稍微不寻常的斐波那契序列生成器是我希望我能做的一个例子:
(defn make-fibo [y]
(memoize (fn fib [x] (if (< x 2)
y
(+ (fib (- x 1))
(fib (- x 2)))))))
(let [f (make-fibo 1)]
(f 35)) ;; SLOW, not actually memoized
使用with-local-vars
似乎是正确的方法,但它对我也不起作用。我想我不能关闭vars?
(defn make-fibo [y]
(with-local-vars [fib (fn [x] (if (< x 2)
y
(+ (@fib (- x 1))
(@fib (- x 2)))))]
(memoize fib)))
(let [f (make-fibo 1)]
(f 35)) ;; Var null/null is unbound!?!
我当然可以手动编写一个宏来创建一个封闭的原子并自己管理记忆,但我希望在没有这种黑客的情况下做到这一点。