2011-08-10 7 views
11

는이 같은 성명이 있습니다목록을 라켓의 인수 목록으로 어떻게 전달합니까?

((lambda (a b c) (+ a b c)) 1 2 3) ; Gives 6 

을 그리고 또한 그래서 그것을 목록을 통과 할 수 있도록하고 싶습니다 :이 제외

((lambda (a b c) (+ a b c)) (list 1 2 3)) 

...이 때문에 작동하지 않습니다 전체 목록은 'a'로 전달됩니다. 목록을 인수로 분해 할 수있는 방법이 있습니까?

내가 찾고있는 것은 Python의 * 문자와 비슷한 것입니다. 문법에 익숙하지 않은 사용자 :

def sumthree(a, b, c): 
    print a + b + c 

sumthree(1, 2, 3) # Prints 6 
sumthree(*(1, 2, 3)) # Also prints 6 

답변

20

해당 작업은 apply입니다.

(apply + (list 1 2 3)) ; => 6 

apply "마지막 인수를 확장합니다. 이전 인수는 그대로 전달됩니다.

(apply + 1 2 3 (list 4 5 6)) 
(apply + (list 1 2 3 4 5 6)) 
(+ 1 2 3 4 5 6) 
8

에주의 다음과 같은 정의

(define (a . b) (apply + b)) 
(a 1) 
(a 1 2) 
(a 1 2 3) 

에 : 그래서 이것들은 모두 동일합니다 '.' 함수에 여러 개의 인수를 전달할 수있는 기능을 제공합니다. 필요한 인수가 여전히있을 수 있습니다.

(define (f x . xs) (apply x xs)) ;; x is required 
(f + 1 2 3) ;; x is +, xs is (1 2 3) 
+0

실제로 이것은 적용 함수를 찾는 원래의 이유입니다. 꽤 산뜻한 재료. – peskal

+0

이것은 정말 멋지다. – setholopolus

+0

이 구문의 사용법을 설명하는 문서 : https://docs.racket-lang.org/guide/define.html – setholopolus

관련 문제