2012-08-11 7 views
5

는 세 개의 인수에 대응 1, 2의 기능과 아래 3가 있다고 가정 :혼합 arity 함수의 체인을 평가하고 필요할 경우 부분 함수를 반환 할 수 있습니까?

(defn I [x] x) 
(defn K [x y] x) 
(defn S [x y z] (x z (y z))) 

Clojure에서이 평가하는 평가 기능이나 관용구가 있습니까 :

(I K S I I) as (I (K (S (I (I))))) 

이 인수에 대응 2의 parital 기능을 반환을?

위의 간단한 함수 정의를 사용하여 부분 결과를 반환 할 수있는 여러 가지 기능으로 확장 할 수있는 매크로를 만드는 것이 좋습니다. 이 작업을 수행하기 위해 이미 내장 된 또는 관용적 인 방법이있는 경우 매크로를 작성하고 싶지 않습니다.

(defn I 
    ([x] I x) 
    ([x & more] (apply (I x) more))) 

(defn K 
    ([x] (partial K x)) 
    ([x y] x) 
    ([x y & more] (apply (K x y) more))) 

(defn S 
    ([x] (partial S x)) 
    ([x y] (partial S x y)) 
    ([x y z] (x z (y z))) 
    ([x y z & more] (apply (S x y z) more))) 
+0

방금 ​​찾은이 * 당신을 위해 완벽 할 수도 있고, 다른 도움이되지 않는다면 적어도 도움이 될 것이라고 생각했습니다. http : //alfredodinapoli.wordpress.com/2011/03/16/a-bit-of -clojure-magic-and-order-functions-are-served/ –

답변

5

나는 완전히 당신이 뭘 하려는지 이해가 확실하지 않다,하지만 comp 기능은 이러한 종류의 일을하는 데 유용합니다 : 여기

는 확장 된 매크로는 위의 기능에 대해하고 싶은 것입니다 "기능 체이닝"에 대해 이야기하는 것 같습니다. 예를 들어 당신이 목록 (I K S I I)이있는 경우, 귀하의 경우에는

user> (vec (rest (list 1 2 3 4 5))) 
=> [2 3 4 5] 

, 당신은 내가 (reduce comp ...)을 사용, (I (K (S (I (I)))))로 평가하고 싶지만, 당신은 할 수 :

user> ((comp vec rest list) 1 2 3 4 5) 
=> [2 3 4 5] 

에 해당 어떤 또한 (apply comp ...)을 사용하십시오.

user> ((reduce comp [vec rest list]) 1 2 3 4 5) 
=> [2 3 4 5] 
user> ((apply comp [vec rest list]) 1 2 3 4 5) 
=> [2 3 4 5] 

는 또한 -> 또는 ->> 매크로에 관심이있을 수 있습니다. 이러한 매크로는 인수를 다음 인수로 순서대로 중첩합니다. -> 매크로는 다음 식의 첫 번째 위치로 중첩되지만 ->> 매크로는 다음 식의 마지막 위치로 중첩됩니다. "다음 일"이 함수이면 둘 다 똑같이 동작하고 (function nested-things-so-far)의 표현식을 형성하고 계속 진행합니다.

정말, 예를 들면 최고 :

(-> 1 (+ 10) (- 100) inc) 
;//Expands to... 
(inc (- (+ 1 10) 100)) 
;//Evaluating in the REPL... 
user> (-> 1 (+ 10) (- 100) inc) 
=> -88 

(->> 1 (+ 10) (- 100) inc) 
;//Expands to... 
(inc (- 100 (+ 10 1))) 
;//Evaluating in the REPL... 
user> (-> 1 (+ 10) (- 100) inc) 
=> 90 

그러나, 당신이 (다시, 나는 완전히 이해 생각하지 않는다,하지만) 자동 태닝을 포함하는 뭔가를하고 싶은 많은 것 같아, 그리고 그것을 위해 나는 기존의 내장 된 방법에 대해서는 모른다.

+0

이 답변을 주셔서 감사합니다. 내가 잠시 시간을내어 clojure와 lisp 타입 프로그래밍을 처음 접한 이래로 내가하고있는 일을 단순화 할 수 있는지 살펴볼 것이다. 가끔은 내가하고 싶은 것을 알고 있지만 그것이 무엇인지 불분명하고 심지어 좋은 검색어가있을 때조차도 검색 결과는 매우 제한적입니다. 내가하려는 일이 "자동 currying"이라고 불리는 것이 큰 도움이된다는 것을 알아 내십시오. – dansalmo