Non sono la stessa cosa! I loro nomi possono effettivamente aiutare a ricordare chi fa cosa.
map
prenderà come argomento una procedura e una o più liste. La procedura sarà chiamata una volta per ogni posizione delle liste, utilizzando come argomenti l'elenco degli elementi in quella posizione:
(map - '(2 3 4))
; => (-2 -3 -4)
map
chiamato (- 2)
, (- 3)
, (- 4)
per creare l'elenco.
(map + '(1 2 3)
'(10 20 30))
; => (11 22 33)
map
chiamato (+ 1 10)
(+ 2 20)
(+ 3 30)
per creare l'elenco.
(map * '(2 2 -1)
'(0 3 4)
'(5 4 2))
; => (0 24 -8)
map
chiamato (* 2 0 5)
(* 2 3 4)
(* -1 4 2)
per creare l'elenco.
map
ha quel nome perché implementa un (funzione) "mappa" su un insieme di valori (nelle liste):
(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
avrà almeno due argomenti, il primo di essi essendo una procedura e l'ultima una lista.Si chiamerà la procedura con i seguenti argomenti, compresi quelli all'interno della lista:
(apply + '(2 3 4))
; => 9
Questa è la stessa (+ 2 3 4)
(apply display '("Hello, world!"))
; does not return a value, but prints "Hello, world!"
Questo è lo stesso di (display "Hello, world!")
.
apply
è utile quando si dispone di argomenti come una lista,
(define arguments '(10 50 100))
(apply + arguments)
Se si tenta di riscrivere l'ultima riga senza utilizzare apply
, vi renderete conto che è necessario un loop all'interno di lista sommando ogni elemento. ..
apply
può anche essere utilizzato con più di questi due argomenti. Il primo argomento deve essere un oggetto callable (una procedura o una continuazione). L'ultimo deve essere una lista. Gli altri (tra il primo e l'ultimo) sono oggetti di qualsiasi tipo. Quindi chiedono
(apply PROC a b c ... y z '(one two ... twenty))
è lo stesso di chiamare
(PROC a b c ... y z one two ... twenty)
Ecco un esempio concreto:
(apply + 1 -2 3 '(10 20))
; => 32
Questa è la stessa di (+ 1 -2 3 10 20)
apply
ha quel nome perché permette per "applicare" una procedura a diversi argomenti.
In Schema 'apply' prende un numero qualsiasi di argomenti, ma il primo deve essere qualcosa chiamabile (procedura o continuazione) e l'ultimo deve essere una lista. Gli argomenti in mezzo sono i primi argomenti .. '(applica l'elenco di mappe '((abc) (1 2 3))) => ((a 1) (b 2) (c 3))' – Sylwester
@Sylwester: sì, Ho modificato il post. Grazie! – Jay
Un'altra importante differenza è che la mappa restituisce sempre una lista. –