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

Ich kann nicht wirklich meinen Kopf um diesen Ausdruck wickeln. Was passiert hier?Ich brauche Hilfe meinen Kopf um ein Schema Ausdruck

+1

Bald wird merken Sie und denken Sie daran "apply-map-Liste" als ein berühmter Lisp-Idiom zum Transponieren einer 2D-List-of-Lists-Matrix. Ich habe Gerüchte gehört, dass Google, nicht zufrieden mit "map-reduce", plant, "apply-map-list" über seine Cluster zu verteilen, um das Internet auf sein Ohr zu richten. – Kaz

Antwort

8

Das erste, was Sie verstehen müssen, ist, was map tut. map nimmt eine Funktion und eine oder mehrere Listen. map ruft dann diese Funktion für das erste Element jeder Liste auf, und das wird der erste Wert in der Liste, die von map zurückgegeben wird. map wiederholt dies für das zweite Element in jeder Liste und so weiter, bis eine der Listen keine Elemente mehr enthält. Zum Beispiel:

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

map erste Anrufe + auf dem ersten Argumente jeder Liste, 1 und 4, 5 als ersten Wert in der Ergebnisliste zu erhalten. Die anderen Werte werden auf die gleiche Weise berechnet.

apply funktioniert, indem Sie eine Funktion, eine Reihe von Werten und eine Liste als letztes Argument nehmen. apply erste anhängt alle seine Argumente neben der Funktion auf der Liste als letztes Argument übergeben, so dass:

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

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

apply wird dann die Funktion in die sie mit jedem Element des übergebenen Anrufe Liste als separates Argument, so dass die oben wird:

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

map rufen list auf das erste Argument jeder Liste und erhalten (a 1), die der erste Wert in der resultierenden Liste wird. Das gleiche passiert für den Rest der Listen.

2

apply ist einfach als rein textliche Transformation des Codes zu handhaben, von

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

zu

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