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.
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
@Sylwester: tak, Edytowałem post. Dzięki! – Jay
Inną ważną różnicą jest to, że mapa zawsze zwraca listę. –