J'essaie d'écrire une fonction qui renvoie une fonction récursive mémorisée en Clojure, mais j'ai du mal à faire en sorte que la fonction récursive voie ses propres liaisons mémorisées. Est-ce parce qu'il n'y a pas de var créé ? De même, pourquoi ne puis-je pas utiliser memoize sur la liaison locale créée avec let ?
Ce fabricant de séquences de Fibonacci légèrement inhabituelles qui commencent à un nombre particulier est un exemple de ce que j'aimerais pouvoir faire :
(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
Utilisation de with-local-vars
semble être la bonne approche, mais ça ne marche pas pour moi non plus. Je suppose que je ne peux pas fermer sur les variables ?
(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!?!
Je pourrais bien sûr écrire manuellement une macro qui crée un atome fermé et gérer moi-même la mémorisation, mais j'espérais pouvoir le faire sans avoir à recourir à de tels artifices.
0 votes
La solution donnée par @Phelix et @CarlosNunes est sur le Page ClojureDocs pour
memoize
.