2011-12-11 3 views
1

페이지에서 사용 가능한 모든 링크를 반복적으로 크롤링하고 작동중인 링크의 유효성을 검사하는 경우 해당 페이지에서 모든 링크를 가져와 현재 페이지가 완료되면 크롤링 할 목록에 추가하십시오. 그러나 나는 링크의 순서대로 Conj를 사용하여 문제가 발생했다고 생각한다.Clojure 시퀀스 : 요소를 추가하지 않습니까?

코드를 실행할 때 처음 함수를 호출 할 때 피드의 초기 목록 만 표시됩니다.

(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))))) 

나는 그 목록에 추가 항목을 추가하지 않는 이유를 확실히 모르겠어요. 누구든지이 일을 왜 제안 할 수 있습니까?

답변

3

Clojure의 데이터 구조는 변경 불가능합니다.

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

몇 가지 추가 : 당신은 데이터 구조와 아무것도하지 않을는에서 반환

  • 위에서 get-link에 의해 반환되는 어떤을 요소로 링크의 현재의 서열을 추가; 아마 당신이하고 싶은 것이 아닙니다.
  • 이 방법을 사용하여 작업하거나 지연 시퀀스를 생성하는 방법을 배우는 것이 좋습니다.
  • 주기를 조심하십시오.
+0

귀하의 권리, 고마워! – Dale

+0

몇 가지를 추가하여 편집했습니다. –

+0

좋아, 내가 게으른 시퀀스 및주기 작업에 대한 자세한 내용을 살펴 보겠습니다. 감사. – Dale

2

tree-seq을 사용하는 재미있는 기회입니다. URL에서 나무를 만들고 각 URL의 '자녀'는 텍스트를 더럽히고 더 ​​많은 링크를 찾아서 결정됩니다. 그런 다음 Alex가 언급 한주기 문제를 제외하고는 다른 시퀀스와 마찬가지로 일련의 링크를 걸을 수 있습니다.

관련 문제