Три совета, которые могут сделать вашу жизнь проще здесь:
Wrong number of args passed to: problem31$eval--25$make-combination-counter--27$recurse--29$fn (NO_SOURCE_FILE:0)>
Примерно сообщает вам, где произошла ошибка: $fn
в конце означает анонимную функцию и сообщает, что она была объявлена внутри recurse, который был объявлен внутри make-combination-counter
. На выбор доступны две анонимные функции.
Если вы сохраните свой исходный код в файле и выполните его как скрипт, он даст вам полную трассировку стека с номерами строк в файле.
at net.projecteuler.problem31$apply_if__9.invoke(problem31.clj:7)
Обратите внимание, что вы также можете проверить последнее исключение и трассировку стека из REPL, изучив * e, например: (.stackTrace * e) Трассировка стека на первый взгляд довольно устрашает, поскольку она отбрасывает все внутренние компоненты Java. Вам нужно научиться игнорировать их и просто искать строки, которые относятся к вашему коду. Это довольно легко в вашем случае, так как все они начинаются с net.projecteuler
Вы можете назвать свои анонимные функции, чтобы помочь быстрее идентифицировать их:
(fn check-max [x] (<= (+ current-sum x) max-sum))
В вашем случае, используя всю эту информацию, вы можете видеть, что apply-if передается функция с одним аргументом в качестве забавы. Применить это (f [1 2 3]) -> (f 1 2 3). Из вашего комментария, что вы хотите, это карта. (карта f [1 2 3]) -> (список (f 1) (f 2) (f 3)). Когда я заменяю apply
на map
, программа, кажется, работает.
Наконец, если вы хотите изучить значения, вы можете посмотреть на clojure-contrib.logging
, у которого есть некоторые помощники для этого эффекта. Есть шпионский макрос, который позволяет вам обернуть выражение, он будет возвращать точно такое же выражение, поэтому он не повлияет на результат вашей функции, но выведет EXPR = VALUE
, что может быть удобно. Также в группе различные люди разместили полные решения для отслеживания. И всегда есть верный println
. Но ключевым навыком здесь является способность точно определить, что взорвалось. Как только вы узнаете, что обычно понятно почему, но иногда требуются распечатки, когда вы не можете определить, какие вводные данные.