Estoy tratando de escribir una función que devuelva una función recursiva memorable en Clojure, pero estoy teniendo problemas para que la función recursiva vea sus propios enlaces memorados. ¿Esto es porque no hay var creada? Además, ¿por qué no puedo usar memoize en el enlace local creado con let?¿Cómo puedo generar funciones recursivas memorizadas en Clojure?
Este fabricante de poco inusual secuencia de Fibonacci que comienza en un número en particular es un ejemplo de lo que me gustaría poder hacer:
(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
Usando with-local-vars
parece que el enfoque correcto, pero no funciona para mí ya sea. ¿Supongo que no puedo cerrar sobre 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!?!
Podría, por supuesto, escribir manualmente una macro que crea un átomo-sobre cerrado y gestionar el memoization mí mismo, pero yo estaba esperando para hacer esto sin tal hackery.
La solución dada por @Phelix y @CarlosNunes está en la [página de ClojureDocs para 'memoize'] (http://clojuredocs.org/clojure.core/memoize). – Thumbnail