2011-08-10 16 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

これは実際に私がapply関数を探していた元の理由です。かなり素敵なもの。 – peskal

+0

これはとてもクールです。 – setholopolus

+0

この構文の使用方法について説明しているドキュメント:https://docs.racket-lang.org/guide/define.html – setholopolus

関連する問題