2014-03-30 2 views
0

명명 된 매개 변수를 해시 맵에서 함수에 전달할 수 있기를 원합니다. 다음과 같은 함수가 있다고 가정 해 보겠습니다.해시 맵에서 명명 된 매개 변수로 Clojure 함수 호출

(defn foo [a & {:keys [b]}] (println a b)) 

맵에서 오는 매개 변수를 사용하여이 함수를 호출하고 싶습니다. 나는 이런 식으로 작업을 수행 할 수 있습니다 알고

(apply foo 1 (mapcat identity {:b 2})) 

그러나 확실하게이 작업을 수행 할 수있는 더 관용적 덜 투박한 방법이 있어야합니다, 그렇지?

답변

1

아니, 없다. 하지만 mapcat을 통해 그 일을 대신 직접 concat을 사용할 수 있습니다 :

(apply foo 1 (apply concat {:b 2})) 

당신은 또한 명확 (안 짧은하지만) 할 매크로 ->>을 사용할 수 있습니다 :

(->> {:b 2} 
    (apply concat) 
    (apply foo 1)) 
+0

나는 'concat'을 적용하는 것을 좋아한다, 고마워. 실을 꿰는 연산자를 사용하면 실제로 적어도 나에게는 분명하지 않습니다. :) –

1

아니, 다른 덜 clunky 방법입니다. 키 위해 그것을 매개 변수와 패턴이 일치하는 것으로 해시 맵을 적용하려면 foo을 더 잘 될 것이다 :

(defn foo [a {:keys [b]}] (println a b)) 
(foo 1 {:b 2}) 
+0

'(foo는 1 : B 2) '나는 적어도 읽은 Clojure 코드에서'(foo 1 {: b 2})'보다 훨씬 관용적이라고 느낀다. –

관련 문제