Y a-t-il une différence entre «#» (lambda… »et« (lambda… »? [Duplicate]
Dans Practical Common Lisp, il y a un exemple de REMOVE-IF-NOTavec 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#'xest lue comme(function x). Donc#'(lambda (...) ...)est lu comme(function (lambda (...) ...)), oùfunctionest l'opérateur spécial dans CL qui dit que son argument désigne une fonction;lambdase 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,
#'foosifooest une fonction, donc il peut être considéré comme plus cohérent de l'utiliser également pour lelambdacas; - ce n'était pas toujours le cas dans CL qui
lambdaavait 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.