2014-12-15 9 views

Odpowiedz

21

To nie to samo! Ich imiona mogą pomóc w zapamiętaniu, co robi co.

map przyjmie jako argument jedną procedurę i jedną lub więcej list. Procedura będzie wywoływana raz dla każdej pozycji z listy, używając jako argumenty listę elementów w tej pozycji:

(map - '(2 3 4)) 
; => (-2 -3 -4) 

map nazywa (- 2), (- 3), (- 4) zbudować listę.

(map + '(1 2 3) 
     '(10 20 30)) 
; => (11 22 33) 

map nazywa (+ 1 10)(+ 2 20)(+ 3 30) zbudować listę.

(map * '(2 2 -1) 
     '(0 3 4) 
     '(5 4 2)) 
; => (0 24 -8) 

map nazywa (* 2 0 5)(* 2 3 4)(* -1 4 2) zbudować listę.

map ma tę nazwę, ponieważ implementuje „map” (funkcja) na zbiorze wartości (w listach):

(map - '(2 3 4)) 
arguments  mapping "-"  result 
    2  === (- 2) ===>  -2 
    3  === (- 3) ===>  -3 
    4  === (- 4) ===>  -4 

(map + '(1 2 3) 
     '(10 20 30)) 
arguments  mapping "+"  result 
    1 10  === (+ 1 10) ===>  11 
    2 20  === (+ 2 20) ===>  22 
    3 30  === (+ 3 30) ===>  33 

apply odbędzie przynajmniej dwa argumenty, pierwszy z nich bycie procedurą i ostatnią listą.Będzie ona wywołać procedurę z następującymi argumentami, w tym wewnątrz listy:

(apply + '(2 3 4)) 
; => 9 

To jest taka sama jak (+ 2 3 4)

(apply display '("Hello, world!")) 
; does not return a value, but prints "Hello, world!" 

To jest taka sama jak (display "Hello, world!").

apply jest przydatna, gdy masz argumentów w postaci listy,

(define arguments '(10 50 100)) 
(apply + arguments) 

Jeśli próbujesz przerobić ostatni wiersz bez użycia apply, zdasz sobie sprawę, że trzeba pętla na liście podsumowującej każdy element. ..

może być również używany z więcej niż dwoma argumentami. Pierwszy argument musi być obiektem wywoływalnym (procedura lub kontynuacja). Ostatni musi być listą. Pozostałe (między pierwszym a ostatnim) są obiektami dowolnego typu. Więc wywołanie

(apply PROC a b c ... y z '(one two ... twenty)) 

jest taka sama, jak dzwoni

(PROC a b c ... y z one two ... twenty) 

Oto konkretny przykład:

(apply + 1 -2 3 '(10 20)) 
; => 32 

To jest taka sama jak (+ 1 -2 3 10 20)

apply jest to imię, ponieważ pozwala "zastosować" procedurę do kilku argumentów.

+1

W schemacie 'apply' przyjmuje dowolną liczbę argumentów, ale pierwsza musi być czymś wywoływalnym (procedura lub kontynuacja), a ostatnia musi być listą. Argumenty pośrednie są pierwszymi argumentami .. '(zastosuj listę map '((abc) (1 2 3))) => ((a 1) (b 2) (c 3))' – Sylwester

+0

@Sylwester: tak, Edytowałem post. Dzięki! – Jay

+1

Inną ważną różnicą jest to, że mapa zawsze zwraca listę. –

3

Nie, apply nazywa swój pierwszy argument jako procedura, z całą resztą jak jej argumentów, z ostatnim - listy - Otwarty w górę, czyli jego zawartość „krojonej w”:

(apply f a b (list c d e)) == (f a b c d e) 

Eg:

(zastosowanie + 1 2 (lista 3 4 5))
; Wartość: 15

jest tylko jedno połączenie; map rzeczywiście wywołuje swój pierwszy argument dla każdego elementu elementu jego drugiego argumentu.

Jeden łączne stosowanie map i apply jest słynny transpose trick:

(zastosowanie listy map „((1 2 3) (10 20 30)))
; Wartość: ((1 10) (2 20) (3 30))