2013-05-22 4 views
3

나는 다음과 같은 형식인수로 전달하는 기능 만들기 : 다른 기능 키를

(defn foo [& {:keys [x y z]}] 
    ...) 

를받는 함수를 그리고 난 항상 단지 키가 y 및 z받는 함수를 만들려고하지만, x에 같은 값을 준다. {... 키} 다시 비트, 실제 함수 foo는 향후 변경 될 수 있습니다 더 많은 키를 가지고 나는 내 유일한 문제는 내가 반복해야한다는 것입니다이

(defn bar [& {:keys [y z]}] 
    (foo :x "blah" :y y :z z)) 

처럼 쓸 수 있습니다. bar가 어떤 키 - 값 쌍을 받아들이도록 만들 수있는 방법이 있는가? 그리고 x를 동일하게 유지하면서 모든 것을 foo로 전달할 수 있는가?

+1

가변적으로 기능이 필요합니까? 아니면지도를 전달하고 싶습니까? –

+0

그것은 variadic해야합니다, 나는지도를 통과하고 싶지 않아요. – Sotanaht

답변

2

이 작동하고 bar에 전달 된 모든 :x 값 오버라이드 (override) : 당신은 앰퍼샌드 (&) 당신이 가변 기능을 선포을 사용하면

(defn foo [& {:keys [ x y ]}] 
    [x y]) 

(defn bar [ & args ] 
    (apply foo (concat args [:x "blah"]))) 
+1

bar의 args에 이미 x 값이 있으면 문제가됩니다. – mobyte

+0

이것은 정확하게 내가 원하는 것입니다. 고마워 :) – Sotanaht

+0

@mobyte 그것은 단지 오류가 발생하면 더 나은 : x는 술집에 주어집니다, 왜냐하면 술집은 오직 하나만 필요하기 때문에 : x 값. – Sotanaht

1

합니다. 아마도 여러분의 함수가 가변적 일 필요는 없습니다.

(defn foo [{:keys [x y z]}] 
    [x y z]) 

(defn bar [{:keys [y z] :as args}] 
    (foo (assoc args :x "blah"))) 

을 그리고 당신은이 같은지도 bar를 호출합니다 : : 당신은 단순히이 작업을 수행 할 수 있습니다 (bar {:y 20 :z 10})을.

(defn bar [& {:keys [y z] :as args}] 
    (foo (assoc args :x "blah")) 

을 그리고 당신은 그런 bar 호출하는 것입니다 : 당신이 정말 가변 기능으로 bar이 필요하면, 당신은 단지 (foo는 위에서 동일)이 작업을 수행 할 수 있습니다 (bar :y 10 :z 20)을. foo을 가변적으로 만들 수도 있지만 인수 목록을 직접 다시 작성해야합니다 (예 : (flatten (map list (keys args) (vals args))))).

+0

아니요, 확실히 variadic해야합니다. 실제 foo 함수는 값을 레코드에 넣는 것으로, 함수가 실행될 때 그 값 중 일부는'nil '이 될 수 있습니다. – Sotanaht

2
(defn bar [& {:keys [y z] :as args}] 
    (apply foo (apply concat (assoc args :x "blah"))))