2010-07-11 5 views
4

나는 Clojure 루프에 갇혀 빠져 나오기 위해 도움이 필요하다.Clojure 루프에 갇혀있다. 약간의 지침이 필요하다.

은 내가 먼저 내가

(get lawl 0) 

을 대가로 "1"을 얻을 벡터

(def lawl [1 2 3 4 5]) 

을 정의하고 싶다. 지금, 나는 벡터의 각 번호를 루프를 원하는, 그래서 수행

이는 내가의 수를 다음 낮은 경우 다음 전무로 난의 값을 설정하도록되어 내 마음에
(loop [i 0] 
    (if (< i (count lawl)) 
    (get lawl i) 
     (recur (inc i)))) 

lawl 벡터를 사용하면 각 lawl 값을 가져온 다음 i 변수를 1로 늘린 다음 다시 시도하여 벡터의 다음 값을 가져와야합니다.

그러나이 방법은 효과가 없으며 시간을 들여 작업을 완료하고 완전히 막혔습니다. 도움을 주시면 감사하겠습니다. 나는 또한 "if"를 "when"을 같은 결과로 변경하려고 시도했다. REPL이 새로운 라인을 입력하고 깜빡이는 데이터를 제공하지 않는다.

수정 : 반복 횟수가 수정되었습니다.

답변

7

뜻 "각 lawl 값을 얻을 수 있습니다." get 호출은 실제로 적절한 값을 "가져옵니다"하지만 아무 것도하지 않으므로 단순히 폐기됩니다. Bozhidar가 println을 추가하라는 제안은 좋은 소식이며, 루프가 실제로 lawl의 모든 요소에 액세스한다는 것을 볼 수 있습니다. (inc) =>(inc i) Bozhidar도 언급 한 내용을 수정 한 후를 으로 바꿉니다.

그렇다면 각 번호가 무언가를하고 싶다면 loop/recur은 좋은 방법이 아닙니다. 다음은 다른 몇 가지 예입니다.

;;; do some side-effecty thing to each number in turn: 
(dotimes [i (count lawl)] 
    (println (str i ": " (lawl i)))) ; you don't really need the get either 

;; doseq is more general than dotimes, but doesn't give you equally immediate 
;; acess to the index 
(doseq [n lawl] 
    (println n)) 

;;; transform the lawl vector somehow and return the result: 
; produce a seq of the elements of lawl transformed by some function 
(map inc lawl) 
; or if you want the result to be a vector too... 
(vec (map inc lawl)) 
; produce a seq of the even members of lawl multiplied by 3 
(for [n lawl 
     :when (even? n)] 
    (* n 3)) 

이것은 단지 시작에 불과합니다. Clojure의 표준 라이브러리 둘러보기를 원하시면 Mark Volkmann의 Clojure -- Functional Programming for the JVM 문서를 참조하십시오.

+0

'inc'를'map' 예제에서'produce-html'과 바꾸면 유스 케이스에 가장 잘 어울릴 것입니다. –

+0

와우, doseq 내가 필요한 전부 였어! – bleakgadfly

3

(recur (inc))

(recur (inc i))는 그럼에도 불구하고이 코드는 단지, 결국 1을 반환 당신이 수의 목록을 원하는 경우에 당신이 전혀 필요하지 않습니다 Btw는 인덱스를 기반으로 루프 :-) 인쇄 식을 추가 할 수 있어야한다 이와 같은 시나리오에서

당신이 무엇인지 고려할 필요가
(loop [list [1 2 3 4 5] ] 
     (if (empty? list) 
      (println "done") 
      (do 
       (println (first list)) 
       (recur (rest list))))) 
+0

문제는 각 값을 함수에 "푸시"해야하는 외부 벡터가 있다는 것입니다. 위에 사용 된 예제는 "lawl"벡터의 각 값을 "get"함수로 푸시하려고하는 방법을 보여주는 방법 일뿐입니다. HTML 출력을 생성하는 함수가 있고 파일을 읽고 생성을 위해 HTML 함수로 보내는 함수가 있습니다. 각 파일을 주어진 디렉토리에 벡터로 저장하는 함수를 만들었 기 때문에 각 파일을 함수로 푸시하는 루프를 만들려고합니다. – bleakgadfly

+0

내가 ""/ home/bozhidar/file1 ""/ home/bozhidar/file "을 포함하는 벡터"dirs "가 있다고 가정합시다. 각 파일을 함수로 보내는 루프가 필요합니다. for-loop은 C 나 Python에서 무엇을 할 것입니다. – bleakgadfly

+2

기능에 파일을 보내는 것이 무엇을 의미하는지 스스로에게 물어봐야합니다. 파일 이름을 취하고 일부 HTML을 반환하는 함수가 있다면'(map-produce-html the-files)'(여기서'the-files'는 어떤 seqable, 특히 벡터 일 수 있습니다) .파일 이름을 취하고 HTML *과 관련된 부작용을 일으키는 함수가 있다면,'(doseq [f the-files] (print-html f))'와 같은 것을하고 싶을 것이다. –