Clojure работа с записями - PullRequest
       3

Clojure работа с записями

2 голосов
/ 18 декабря 2011

У меня есть набор значений в 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"} 

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

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

Окончательное обновление

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

["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 доступен в моем профиле.

1 Ответ

1 голос
/ 19 декабря 2011

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

[ {: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 для этого результата, чтобы получить плоский список ссылок вместо вложенной карты в векторе.

Вы можете повторять этот процесс рекурсивно до тех пор, пока не выйдет условие выполнено.

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