Y a-t-il une différence entre «#» (lambda… »et« (lambda… »? [Duplicate]

Dec 14 2020

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

4 tfb Dec 14 2020 at 19:03

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, #'foosi fooest une fonction, donc il peut être considéré comme plus cohérent de l'utiliser également pour le lambdacas;
  • 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.