2016-05-22 5 views
4
(apply map list '((a b c) (1 2 3))) => ((a 1) (b 2) (c 3)) 

私は本当にこの表現の周りに私の頭を包むことはできません。ここで何が起きてるの?私はスキームの表記の周りに私の頭をラップする助けが必要です

+1

に、あなたのコードの純粋なテキスト変換として扱いやすい、あなたが有名なよう「適用マップ・リスト」を暗記して、覚えているでしょう2Dリストリスト行列を転置するためのLispイディオム。私は、地図の縮小に満足していないGoogleが、インターネットを耳にするために、そのクラスタ上に「apply-map-list」を展開する予定であるという噂を聞いてきた。 – Kaz

答えて

8

最初に理解する必要があるのは、mapです。 mapは、関数と1つ以上のリストを取ります。 mapは、各リストの最初の要素でその関数を呼び出し、それはmapによって返されるリストの最初の値になります。 mapは、各リストの2番目の要素に対してこれを繰り返します。リストの1つが要素を使い果たすまで続きます。たとえば、次の結果のリストの最初の値として5を得るために、各リストの最初の引数に

(map + '(1 2 3) '(4 5 6)) => (5 7 9) 
map

最初のコール+、1,4、。他の値も同様に計算されます。

applyは、最後の引数として関数、値の束、リストを取ります。

(apply map list '((a b c) (1 2 3))) 

が、その後の各要素と、それに渡された関数を呼び出します

(apply map (list list '(a b c) '(1 2 3))) 

apply次のようになりますように、最初のapplyは、その最後の引数として渡されたリストへの機能のほかに、そのすべての引数を追加しますリスト個別の引数として、上記なりそう:

(map list '(a b c) '(1 2 3)) 

maplistを呼び出します各リストの最初の引数に、(a 1)が得られ、結果のリストの最初の値になります。他のリストについても同じことが起こります。

2

applyはすぐ

 
(apply map list '( (a b c) (1 2 3) )) 

から

 
(  map list '(a b c) '(1 2 3) ) 
関連する問題