Niedawno zacząłem czytać "On Lisp" Paula Grahamsa i ucząc się nauki clojure wraz z nim, więc prawdopodobnie jest tu jakiś oczywisty błąd, ale nie widzę tego: (jest to oczywiście problem z eulerem projektu)Co jest nie tak z tym programem 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)
Kiedy biegnę ostatni wiersz w REPL, pojawia się błąd:
<#CompilerException java.lang.IllegalArgumentException: Wrong number of args passed to: problem31$eval--25$make-combination-counter--27$recurse--29$fn (NO_SOURCE_FILE:0)>
Oprócz pytanie gdzie jest błąd, tym bardziej interesujące byłoby pytanie: w jaki sposób jeden debugowania to? Komunikat o błędzie nie jest bardzo pomocny i nie znalazłem dobrego sposobu na jednokierunkowy kod typu clojure i nie mogę naprawdę zapytać o przepełnienie stosu za każdym razem, gdy mam problem.
Doskonałe pytanie. Komunikaty o błędach mogą być dość wrogie! –