2012-01-11 2 views
0

나는 작동하는 다음과 같은 코드가 있습니다-> 취하지 않는 이유는 (fn ...)입니까?

(def *primes* 
    (let [l "2 3 5 7 11 13 17 19 23 29 31" 
     f (fn [lst] (filter #(< 0 (count (str/trim %))) lst)) 
     m (fn [lst] (map #(Integer/parseInt %) lst))] 
    (-> l 
     (str/partition #"[0-9]+") 
     f 
     m))) 

을 나는이에 필터 (f)과지도 (m) 함수를 인라인을 변경하는 경우는 :

(def *primes* 
    (let [l "2 3 5 7 11 13 17 19 23 29 31"] 
    (-> l 
     (str/partition #"[0-9]+") 
     (fn [lst] (filter #(< 0 (count (str/trim %))) lst)) 
     (fn [lst] (map #(Integer/parseInt %) lst))))) 

그것은 더 이상 컴파일되지 않습니다 . 오류 :

#<CompilerException java.lang.RuntimeException: java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.lang.Symbol (NO_SOURCE_FILE:227)>

사람이 나에게 설명 할 수 있습니까?

내가 해결하기 위해 노력하고있어 문제가지도와 필터가 마지막 매개 변수로 컬렉션을 소요, 아직 str/partition 처음으로 컬렉션을한다, 그래서 두 ->를 사용하지만 map을 무두질 혼합려고한다는 것입니다 및 filter은 콜렉션이 들어갈 수있는 하나의 (첫 번째) 매개 변수만을 취하는 함수로 변환됩니다.

+1

[함수 호출 -> 스레딩 매크로] 참조 (http://stackoverflow.com/questions/7838326/function-call-in-threading-macro) – 4e6

답변

2

함수 호출로 함수 선언을 사용하고 있습니다. (fn [..] ..)를 (fn [..] ...)로 대체하는 것이 즉각적인 (못생긴) 방법입니다.

+0

이것이 내가 한 일입니다. –

3

->->>을 어느 정도 혼합 할 수 있습니다.

(-> l 
    (str/partition #"[0-9]+") 
    (->> (filter #(< 0 (count (str/trim %))))) 
    (->> (map #(Integer/parseInt %)))) 

그러나 일반적으로 이와 같은 문제는 한 가지 형식으로 너무 많이 사용하려고한다는 표시입니다. 이 간단한 예제는 쉽게 수정할 수 있습니다.

(->> (str/partition l #"[0-9]+") 
    (filter #(< 0 (count (str/trim %)))) 
    (map #(Integer/parseInt %))) 
1

-> 매크로입니다. 이 코드는 사용자가 지정한 코드를 조작 한 다음 해당 코드를 실행합니다. 이와 같이 익명의 함수를 인라인으로 사용하려고하면 이전식이 fn의 첫 번째 인수로 스레드됩니다. 그것은 당신이 원하는 것이 아닙니다. 실제 함수의 첫 번째 인수로 스레드를 삽입하려고합니다.

-> 사용하려면 첫 번째 예제에서와 같이 함수를 미리 선언해야합니다.