2011-12-18 2 views
2

У меня есть набор значений в Clojure, который я хочу структурировать аналогично записи. Я пытаюсь найти лучший способ обработки набора этих записей.Clojure работает с записями

Так что у меня, например запись:

(defrecord Link [page url]) 

Что лучше держать структуру данных коллекции этих записей, которые я могу пошагово рекурсивно, при непрерывном обновлении коллекции?

Раньше я делал это по одному значению с использованием последовательности, а затем конкатенировал новые ссылки в конце, когда я обрабатывал их рекурсивно. Но теперь я хочу больше узнать о каждой ссылке.

Редактировать Для ясности

я раньше использовал карты, однако я думаю, что я путая себя, пытаясь использовать вложенную карту с как

#{:rootlink "http://www.google.co.uk" :links nestedmapoflinks} 

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

Ниже приведен код, который я использовал, ниже - это то, что в настоящее время работает с последовательностью ссылок, но никакой другой информации о ссылке.

(defn get-links 
[url] 
(map :href (map :attrs (html/select (fetch-url url) [:a]))))) 

(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 (concat (rest links) (get-links (first links))))))))) 

Я думаю, что я должен добавить каждый элемент в карту с

{:rootlink "http://www.google.co.uk" :link "http://someurlontherootlinkpage.com"} 

вместо того, чтобы пытаться работать с вложенной картой.

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

Final Update

Итак, после долгих препирательств я наконец придумал это ниже фрагмент кода, который возвращает SEQ векторов, составленных из:

["root link address" "link"] 
["http://www.google.co.uk" "http://www.google.co.uk/examplelink"] 

Код:

(defn get-links 
    [url] 
    (map #(vector url %)(map :href (map :attrs (html/select (fetch-url url) [:a]))))) 

Код теперь на моем github доступен в моем профиле.

+0

Я полностью не понял ваш первоначальный вопрос, я удалю свой ответ. –

+0

Я думаю, что ваш ответ был уместным, он действительно добавил важную информацию о работе с различными структурами данных, которые я задавал в первую очередь. – Dale

+0

Хорошо, я восстановил его. Если вы сочтете это полезным, возможно, кто-то другой. Надеюсь, вы получите ответ на свой конкретный вопрос о необходимой структуре данных, потому что сейчас я ничего не могу придумать. –

ответ

1

Я думаю, что вы путаетесь между использованием структуры типа дерева или плоской структуры. Допустим, у вас есть список ссылок в качестве вектора карты:

[ {:root nil :link "A.COM"} {:root nil :link "B.COM"} ] 

Теперь вы карту над ним и с помощью метода get-link вы получите:

[ [ {:root nil :link "A.COM"} {:root "A.COM" :link "Aa.COM"} {:root "A.COM" :link "Ab.COM"} ] [ {:root nil :link "B.COM"} {:root "B.COM" :link "Ba.COM"} {:root "B.COM" :link "Bb.COM"}] ] 

Теперь вы можете позвонить flatten на этот результат, чтобы получить плоский список ссылок вместо вложенной карты в векторе.

Вы можете повторить этот процесс рекурсивно до вас exit condition met.

Смежные вопросы