Почему эта функция возвращает ноль? Это потому что D.S ленив? - PullRequest
1 голос
/ 06 октября 2009
(defn get-doc-list [a-term]
     (map #(Integer/parseInt %)(take-nth 3 (take (* 3 3)(rest (rest a-term))))))

Эта функция хорошо работает в небольших списках, но возвращает пустую последовательность в больших. В чем проблема?

Ответы [ 2 ]

1 голос
/ 07 октября 2009

Это определенно проблема ввода, так как ваша функция будет анализировать не более 3 целых чисел:

user=> (get-doc-list (repeat "1"))
(1 1 1)

И возвращать пустую последовательность, только если указано менее 3 строк:

user=> (get-doc-list ["1" "1"])
()

И выдать исключение, если дана не строка:

user=> (get-doc-list [1 1 1])
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

Я предлагаю проверить, с каким входом он "терпит неудачу" в действительности ... возможно, вы передаете что-то вроде [["1" "1" "1" ...]]

user=> (get-doc-list [["1" "1" "1"]])
()

Это вектор векторов, поскольку вы можете видеть, что ничего не обрабатывается, поэтому нет ошибок или последовательности для генерации.

0 голосов
/ 07 октября 2009

Проблема заключается в использовании вами функции take, которая возвращает только первые n элементов коллекции. Независимо от того, насколько большую коллекцию вы передаете get-doc-list, только первые 9 передаются на take-nth.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...