0

次の問題があります。私は学校の課題で WebCrawler を作成しており、Clojure で作成しています。これがコードです。

(defn crawl [url current-depth max-depth]
(def hrefs (get-links url))
(if (< current-depth max-depth)
    (map crawl hrefs (iterate eval (inc current-depth)) (iterate eval max-depth))
    hrefs))

(defn get-links [page] 
($ (get! page) td "a[href]" (attr "abs:href")))

get!and$関数は私が書いたものではありません。ここから取得しました: https://github.com/mfornos/clojure-soup/blob/master/src/jsoup/soup.clj

私の問題は、(crawl "http://bard.bg" 0 0)repl から呼び出すと、次の出力が得られることです。

("http://www.bard.bg/genres/?id=1" "http://www.bard.bg/genres/?id=2" "http://www.bard.bg/genres/?id=4" "http://www.bard.bg/genres/?id=5" "http:/
("http://www.bard.bg/genres/?id=1" "http://www.bard.bg/genres/?id=2" "http://www.bard.bg/genres/?id=4" "http://www.bard.bg/genres/?id=5" "http:/
("http://www.bard.bg/genres/?id=1" "http://www.bard.bg/genres/?id=2" "http://www.bard.bg/genres/?id=4" "http://www.bard.bg/genres/?id=5" "http://www.bard.bg/genres/?id=6" "http://www.bard.bg/genres/?id=10" "http://www.bard.bg/genres/?id=17" "http://www.bard.bg/genres/?id=24"
...

では、最初の2lazyseq はどこから来ているのでしょうか? なぜ未完成なのですか?

問題はClojure-Soupにあり、より具体的にはここにあるようです:

(defmacro $ [doc & forms]
   (let [exprs# (map #(if (string? %) `(select ~%)
                  (if (symbol? %) `(select ~(str %))
                     (if (keyword? %) `(select ~(str "#"(name %)))
                        %))) forms)]
 `(->> ~doc ~@exprs#)))`
4

1 に答える 1

1

あなたが説明した問題を再現できません。私の場合(crawl "http://bard.bg" 0 0)、174 個の文字列のリストを返します。

defただし、この機会に、関数内でのの誤った使用法を指摘したいと思いcrawlます。代わりにdefを使用する必要がありますlet。さらに、代わり(iterate eval ...)repeat.

(defn crawl [url current-depth max-depth]
  (let [hrefs (get-links url)]
    (if (< current-depth max-depth)
      (map crawl hrefs (repeat (inc current-depth)) (repeat max-depth))
      hrefs)))

議論については、clojure の let vs def を参照してください。

于 2013-01-12T15:00:06.730 に答える