Последовательность Clojure: не добавляются элементы? - PullRequest
1 голос
/ 12 декабря 2011

Я пытаюсь рекурсивно сканировать все доступные ссылки на странице, и если она проверяет работоспособность, вытяните все ссылки с этой страницы и добавьте их в список для сканирования после завершения текущей страницы.,Однако я думаю, что столкнулся с проблемой использования Conj в моей последовательности ссылок.

Когда я запускаю свой код, кажется, что он только создает первоначальный список ссылок, которые я передаю, когда я впервые вызываю функцию.

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

Я не совсем уверен, почему он не добавляет дополнительные элементы в список.Кто-нибудь может подсказать, почему он это делает?

Ответы [ 2 ]

3 голосов
/ 12 декабря 2011

Структуры данных Clojure неизменны.Вы ничего не делаете со структурой данных, возвращаемой из:

(conj (get-links (first links)) links)

Несколько дополнительных вещей:

  • , приведенное выше добавляет текущий список ссылок в качестве элемента ко всемувозвращается get-link;это, вероятно, не то, что вы хотите сделать.
  • это может быть хорошим временем, чтобы научиться работать с и / или генерировать ленивые последовательности.
  • следить за циклами.
2 голосов
/ 12 декабря 2011

Это выглядит как забавная возможность использовать tree-seq : создать дерево на URL, где «дочерние элементы» каждого URL определяются путем разбрасывания его текста и поиска дополнительных ссылок. Затем, помимо проблемы с циклом, на которую ссылается Алекс, вы можете просто пройтись по последовательности ссылок, как и любая другая последовательность.

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