Recientemente comencé a leer Paul Grahams 'On Lisp', y aprendí a aprender clojure junto con él, por lo que es probable que haya un error muy obvio aquí, pero no lo veo: (es un problema de proyecto euler, obviamente)¿Qué pasa con este programa de Clojure?
(ns net.projecteuler.problem31)
(def paths (ref #{}))
; apply fun to all elements of coll for which pred-fun returns true
(defn apply-if [pred-fun fun coll]
(apply fun (filter pred-fun coll)))
(defn make-combination-counter [coin-values]
(fn recurse
([sum] (recurse sum 0 '()))
([max-sum current-sum coin-path]
(if (= max-sum current-sum)
; if we've recursed to the bottom, add current path to paths
(dosync (ref-set paths (conj @paths (sort coin-path))))
; else go on recursing
(apply-if (fn [x] (<= (+ current-sum x) max-sum))
(fn [x] (recurse max-sum (+ x current-sum) (cons x coin-path)))
coin-values)))))
(def count-currency-combinations (make-combination-counter '(1 2 5 10 20 50 100 200)))
(count-currency-combinations 200)
Cuando ejecuto la última línea en el REPL, me sale el error:
<#CompilerException java.lang.IllegalArgumentException: Wrong number of args passed to: problem31$eval--25$make-combination-counter--27$recurse--29$fn (NO_SOURCE_FILE:0)>
Aparte de la cuestión de dónde está el error, la pregunta más interesante sería: ¿Cómo se podría depurar esto? El mensaje de error no es muy útil, y no he encontrado una buena forma de código clojure de un solo paso, y realmente no puedo preguntar sobre el desbordamiento de la pila cada vez que tengo un problema.
Excelente pregunta. ¡Los mensajes de error pueden ser bastante hostiles! –