Applica & Funcall - I diversi risultati
-
21-12-2019 - |
Domanda
Ansi Common Lisp. Perché ottengo un'altra risposta nell'ultimo caso?
(list 1 2 3 nil) ; (1 2 3 nil)
(funcall (function list) 1 2 3 nil) ; (1 2 3 nil)
(apply (function list) '(1 2 3 nil)) ; (1 2 3 nil)
(apply (function list) 1 2 3 nil) ; (1 2 3)
. Soluzione
APPLY
si aspetta come argomenti:
- .
- una funzione
- zero ... n argomenti
- E poi un elenco di argomenti alla fine
La funzione sarà fondamentalmente chiamata con il risultato di (list* 0-arg ... n-arg argument-list)
Nota che (list* '(1 2 3))
valuta solo (1 2 3)
.
Gli argomenti sono chiamati Elenco argomenti discutibili in comune lisp.
CL-USER 60 > (apply (function list) 1 2 3 nil)
(1 2 3)
CL-USER 61 > (apply (function list) (list* 1 2 3 nil))
(1 2 3)
CL-USER 62 > (apply (function list) (list* '(1 2 3)))
(1 2 3)
.
APPLY
utilizza una tale lista di argomenti spalmabili per progettazione. Ad esempio (... 1 2 3 '(4 5))
. Con FUNCALL
devi scrivere gli argomenti come al solito: (... 1 2 3 4 5)
.
APPLY
ha un unico scopo in comune lisp: consente di chiamare le funzioni con elenchi di argomenti calcolati. Per renderlo un po 'più conveniente, è stata utilizzata questa idea della lista degli argomenti diffusibili. Funziona lo stesso ad esempio in Emacs Lisp.
Immagina di avere un elenco di argomenti e vuoi aggiungere due argomenti davanti.
CL-USER 64 > (apply '+ args)
60
CL-USER 65 > (apply '+ 1 2 args)
63
CL-USER 66 > (apply '+ (append (list 1 2) args))
63
.