Clojure 함수가 가변 개수의 매개 변수를 사용하도록 만드는 방법은 무엇입니까?


81

저는 Clojure를 배우고 있으며 가변 개수의 매개 변수 ( 가변 함수) 를 취하고 이를 합산 하는 함수를 정의하려고 합니다 (예, + 프로 시저처럼). 그러나 나는 그러한 기능을 구현하는 방법을 모릅니다.

내가 할 수있는 모든 것은 :

(defn sum [n1, n2] (+ n1 n2))

물론이 함수는 두 개의 매개 변수와 두 개의 매개 변수 만 사용합니다. 정의되지 않은 수의 매개 변수를 받아들이고 처리하는 방법을 알려주세요.

답변:


108

일반적으로 비 교환 법칙이 성립하는 경우에 당신은 사용할 수 있습니다 적용 :

(defn sum [& args] (apply + args))

더하기는 교환 적이므로 다음과 같이 작동합니다.

(defn sum [& args] (reduce + args))

& 원인 args(의 왼쪽에 아무것도로,이 경우 전체 목록을 인수 목록의 나머지 부분에 바인딩 할 &).

분명히 다음과 같이 합계를 정의하는 것은 의미가 없습니다.

(sum a b c d e ...)

다음과 같이 작성할 수 있습니다.

(+ a b c d e ....)

3
예, 말을하지 않지만 귀하의 답변에 대한 좋은 예입니다. 감사.
rodrigoalvesvieira

@soulcheck : seq합계 함수에 a 를 전달하는 방법이 있습니까 ? 예 : (sum '(1 2 3)) 그리고 결과는 6?
avichalp

@avichalp는 또 다른 기능이 될 것입니다. &두 버전 모두에서 제거
soulcheck

1
@soulcheck : 아니요. 동일한 기능 서명을 사용한다는 의미입니다. 나는 clojure의 초보자이므로 여기에 내 요점을 명확하게 말할 수 있습니다. 내가 알고 싶은 것은 파이썬에서 * args를 사용할 수 있으며 * args (예 def fn(*args): pass)를 취하는 함수가 정의되어 있으면 fn (* list_of_args)와 같은 목록을 제공하여 호출 할 수 있습니다. clojure에서 똑같은 일을 할 수 있습니까?
avichalp

@avichalp에 대한 호출 def fn(*args): passfn([1,2,3])아니지만 fn(1,2,3)(분명히 원하는 작업에 따라 다르지만 여기서 정신을 따르려고합니다)
soulcheck

31

Yehoanathan은 arity 오버로딩을 언급하지만 직접적인 예는 제공하지 않습니다. 그가 말하는 내용은 다음과 같습니다.

(defn special-sum
  ([] (+ 10 10))
  ([x] (+ 10 x))
  ([x y] (+ x y)))

(special-sum) => 20

(special-sum 50) => 60

(special-sum 50 25) => 75


또한 람다와 함께 작동 :(fn ([] (+ 10 10)) ([x] (+ 10 x)) ([x y] (+ x y)))
에릭 Kaplun

17
 (defn my-sum
  ([]  0)                         ; no parameter
  ([x] x)                         ; one parameter
  ([x y] (+ x y))                 ; two parameters
  ([x y & more]                   ; more than two parameters


    (reduce + (my-sum x y) more))
  )


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.