Что случилось с этой программой Clojure?

К сожалению, синтаксис для нечувствительного к регистру соответствия не распространен. В.NET можно использовать RegexOptions. Флаг IgnoreCase или ? я модификатор

5
задан Benno 10 November 2009 в 19:30
поделиться

2 ответа

Три совета, которые могут облегчить вам жизнь здесь:

  1. Неправильное количество аргументов, переданных в: problem31 $ eval - 25 $ make -common-counter - 27 $ recurse - 29 $ fn (NO_SOURCE_FILE: 0)> Сообщает вам примерно, где произошла ошибка: $ fn в конце там означает анонимную функцию и сообщает вам, что она была объявлена ​​внутри рекурсии, которая была объявлена ​​внутри make -common-counter . На выбор есть две анонимные функции.

  2. Если вы сохраните исходный код в файл и выполните его как сценарий, он даст вам полную трассировку стека с номерами строк в файле.

     at net. projecteuler.problem31 $ apply_if__9.invoke (проблема31.clj: 7)
    

    Обратите внимание, что вы также можете исследовать последнее исключение и трассировку стека из REPL, исследуя * e, например: (.stackTrace * e) Трассировка стека поначалу довольно сложна, потому что она вызывает все внутренние компоненты Java. Вам нужно научиться игнорировать их и просто искать строки, которые относятся к вашему коду. В вашем случае это довольно просто, так как все они начинаются с net.projecteuler

  3. . Вы можете назвать свои анонимные функции, чтобы быстрее идентифицировать их:

     (fn check-max [x] (<= (+ текущая сумма x) максимальная сумма))
    

В вашем случае, используя всю эту информацию, вы можете увидеть, что 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 . Но ключевым навыком здесь является способность точно определить, что взорвалось. Когда вы знаете, что обычно становится ясно, почему, но иногда требуются распечатки, когда вы не можете сказать, что это за входные данные.

13
ответ дан 18 December 2019 в 11:57
поделиться

у меня нет REPL, хотя это выглядит так:

(defn apply-if [pred-fun fun coll]
  (apply fun (filter pred-fun coll)))

принимает список вроде '(1 2 3 4 5) отфильтровывает некоторые из них '(1 3 5) а затем создает вызов функции типа (fun 1 3 5)

, и похоже, что он вызывается (apply-if (fn [x] с функцией, которая хочет получить список чисел в качестве единственного аргумента.

вы можете изменить функцию apply-if, чтобы просто передать вызов веселью (без применения), или вы можете изменить ее вызов, чтобы она принимала функцию, которая принимает произвольное количество аргументов.

2
ответ дан 18 December 2019 в 11:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: