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)
Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top