Y a-t-il une différence entre «#» (lambda… »et« (lambda… »? [Duplicate]
Dans Practical Common Lisp, il y a un exemple de REMOVE-IF-NOT
avec un lambda:
CL-USER> (remove-if-not #'(lambda (x) (evenp x)) '(1 2 3 4 5))
(2 4)
Est-ce différent de:
CL-USER> (remove-if-not (lambda (x) (evenp x)) '(1 2 3 4 5))
(2 4)
Une (lambda..)
valeur coïncide avec la forme de la fonction citée #'(..)
? Sur le REPL, il semble que oui, mais comme je suis nouveau dans Lisp, je peux oublier quelque chose (et je me suis sûrement trompé dans le verbiage, alors corrigez-moi aussi).
Réponses
Comme vous vous en doutez, ces deux choses sont les mêmes:
#'
est une macro de lecture et#'x
est lue comme(function x)
. Donc#'(lambda (...) ...)
est lu comme(function (lambda (...) ...))
, oùfunction
est l'opérateur spécial dans CL qui dit que son argument désigne une fonction;lambda
se définit comme une macro: le développement de(lambda (...) ...)
est(function (lambda (...) ...)
: la forme identique à la précédente.
Cela signifie que #'(lambda (...) ...)
, (lambda (...) ...)
et (function (lambda (...) ...))
tous sont la même chose dans CL: ils désignent tous la fonction spécifiée par (lambda (...) ...)
dans l'environnement lexical courant.
Il y a deux raisons pour lesquelles les gens peuvent encore utiliser la #'(lambda (...) ...)
version:
- cohérence - vous avez besoin, par exemple,
#'foo
sifoo
est une fonction, donc il peut être considéré comme plus cohérent de l'utiliser également pour lelambda
cas; - ce n'était pas toujours le cas dans CL qui
lambda
avait la définition de macro qu'il a maintenant, donc le code qui a été écrit entre la spécification CL originale et la norme ANSI, ou qui a été écrit par des personnes qui se souviennent de ces moments, peut utiliser le#'
formulaire.