apply & funcall - les différents résultats
-
21-12-2019 - |
Question
Lisp commun ANSI.Pourquoi j'obtiens une autre réponse dans le dernier cas ?
(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)
La solution
APPLY
attend comme arguments :
- une fonction
- zéro ...n arguments
- puis une liste d'arguments à la fin
La fonction sera essentiellement appelée avec le résultat de (list* 0-arg ... n-arg argument-list)
Noter que (list* '(1 2 3))
évalue à juste (1 2 3)
.
Les arguments sont appelés liste d'arguments à tartiner en Common 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
utilise une telle liste d'arguments tartinable par conception.Par exemple (... 1 2 3 '(4 5))
.Avec FUNCALL
vous devez écrire les arguments comme d'habitude : (... 1 2 3 4 5)
.
APPLY
a un seul objectif en Common Lisp :il permet d'appeler des fonctions avec des listes d'arguments calculées.Pour rendre cela un peu plus pratique, cette idée de liste d'arguments tartinable a été utilisée.Cela fonctionne de la même manière, par exemple dans Emacs Lisp.
Imaginez que vous ayez une liste d’arguments et que vous souhaitiez ajouter deux arguments devant.
CL-USER 64 > (apply '+ args)
60
CL-USER 65 > (apply '+ 1 2 args)
63
CL-USER 66 > (apply '+ (append (list 1 2) args))
63