Clojure рекурсия и ленивая последовательность - PullRequest
4 голосов
/ 14 декабря 2011

Хорошо, я немного застрял на этом, могу ли я на самом деле сделать то, что я пытаюсь сделать с этой частью кода ниже:

(recur (conj (get-links (first links)) (rest links))))

get-links возвращает последовательностьURL-адреса, которые передаются в начальный вызов process-links, затем должны возвращаться.

Первая ссылка, которую я передаю, работает, но затем вторая ссылка, где я пытаюсь соединить одну последовательность с другой, выдает мне следующую ошибку.

"Clojure.lang.LazySeq@xxxxxxx"

Теперь яинтересно, означает ли это ссылку на инструкцию для генерации "rest" (rest rest) не оцененной последовательности?

(defn process-links
  [links]
  (if (not (empty? links))
    (do
      (if (not (is-working (first links)))
        (do
          (println (str (first links) " is not working"))
          (recur (rest links)))
        (do
          (println (str (first links) " is working"))
          (recur (conj (get-links (first links)) (rest links))))))))

Если я совершенно не прав в моем подходе к этому,дай мне знать.

Ответы [ 2 ]

7 голосов
/ 14 декабря 2011

conj добавляет элемент в коллекцию.Использование его в двух коллекциях создает вложенную структуру.Вы, вероятно, хотите вместо concat двух последовательностей.

Для иллюстрации:

user> (conj [1 2 3] [4 5 6])
[1 2 3 [4 5 6]]
user> (concat [1 2 3] [4 5 6])
(1 2 3 4 5 6)
1 голос
/ 19 декабря 2011

По поводу вещи "Clojure.lang.LazySeq@xxxxxxx":

Проблема в следующем фрагменте:

(println (str (first links) " is working"))

Здесь вы используете функцию сцепления строк str для склеиваниявместе (first links), который в данном случае не является строкой, и " is working", который является строкой.Что str делает с нестроковым аргументом?Он вызывает метод .toString.Что .toString делает для данных Clojure?Не всегда то, что вам нужно.

Решение заключается в использовании семейства функций pr.pr записывает данные Clojure в поток способом, который распознается читателем clojure.Два примера того, как приведенный выше фрагмент может быть переписан:

(do (pr (first links))
    (println " is working"))

;; Sligtly less efficient since a string must be created
(println (pr-str (first links)) "is working")

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

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