2014-04-13 2 views
1

나는 벡터를 가지고 있으며 Clojure에서 함수를 호출하려고한다. 이 함수는 많은 인수를 받아들이고 벡터를가집니다.은 * 또는 ** python으로 clojure에 뭔가가 있습니까?

예를 들어

:

(defn f [a b] (+ a b)) 

나는 벡터 있습니다

[1 2] 

내가 사용할 수있는이 적용

(apply f [1 2]) 

을하지만 파이썬에서 같은 Clojure의에서 f를 호출 할 수 있습니다?

(f *[1 2]) . 

내 사용 사례

내가지도에서 일부 키를 dissoc 필요가있다. (dissoc amap *keys) (으)로 전화하고 싶지만 지원되지 않습니다.

나는 apply

(apply dissoc (cons amap keys)) 

을 사용할 수 있지만 그렇게 편리하지 않습니다.

Clojure에서이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

+8

'적용'의 문제점은 무엇입니까? –

+2

@ user2219372 당신은 항상 *와 **를 올바르게 읽을 수있는 매크로를 만들 수 있습니다.하지만이 파이썬 구문의 세부 사항을 놓고 클로저 방법을 배우는 일에 빠져 나가야합니다! – leontalbot

+0

아마도 파이썬 * 연산자에서 적용되는 이점/차이점을 적용하면 도움이 될까요? – NielsK

답변

6

그 밖의 사람들은 모두 에 해당하는 파이썬의 arbitrary argument lists입니다. 사용에-경우, a-map

에서 dissoc some-keys

(def a-map {1 2, 3 4, 5 6}) 
(def some-keys (range 5)) 

을 부여

(apply dissoc a-map some-keys) 
; {5 6} 

내 원래의 솔루션은 주요 인수를 취할 수

(reduce dissoc a-map some-keys) 
; {5 6} 

하지만 때문에 dissoc 작동 한 번에 하나씩 또는 한 번에 모두.

+0

대단합니다! 그게 내가 원하는거야. – user2219372

+5

그냥'(dissoc-map some-keys)'를 사용하십시오. 'apply '가 무엇을위한 것인지,'* keys' 사용법을 완벽하게 반영합니다. 'dissoc' (그리고 다른 많은 경우)의 특정 경우에'reduce '도 괜찮지 만,'apply'는 OP가 요구 한 clojure의''foo'의 "version"입니다. – amalloy

관련 문제