Я пытаюсь написать функцию, которая возвращает memoized рекурсивную функцию в Clojure, но у меня возникают проблемы с тем, чтобы рекурсивная функция отображала свои собственные memoized привязки. Это потому, что не создано var? Кроме того, почему я не могу использовать memoize для локальной привязки, созданной с let?
Этот слегка необычный создатель последовательности Фибоначчи, который начинается с определенного числа, является примером того, что я хотел бы сделать:
(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
похоже на правильный подход, но для меня это тоже не работает. Думаю, я не могу закрывать варны?
(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!?!
Я мог бы, конечно, вручную написать макрос, который создает замкнутый атом и сам управлять записью, но я надеялся сделать это без такого хакерства.