Q: Quand, si jamais, est-il utile de citer un aiguisé lambda
, et quand, si jamais, ne faut-il pas citer un a lambda
?
Les gens utilisent lambda
s de trois manières:
- plaine:
(lambda (x) x)
- cité:
'(lambda (x) x)
- pointu:
#'(lambda (x) x)
Ce thread SO discute des trois types, ce thread SO explique pourquoi ne pas citer (NB: pas de guillemets pointus ) lambda
, et ce thread SO discute également des distinctions entre les citations et les citations pointues.
Maintenant, le nœud manuel sur les fonctions anonymes et la docstring pour lambda
noter que les lambda
s sont auto-cités:
Un appel du formulaire
(lambda ARGS DOCSTRING INTERACTIVE BODY)
est auto-citant; le résultat de l'évaluation de l'expression lambda est l'expression elle-même. L'expression lambda peut alors être traitée comme une fonction ...
Ainsi, il semble que (lambda (x) x)
et #'(lambda (x) x)
sont équivalents, mais '(lambda (x) x)
ne le sont pas (surtout, lors de la compilation d'octets).
Il semble que l'on veuille rarement citer un lambda
, mais je ne sais pas quand, si jamais, nous devrions, ou ne devrions pas, citer clairement:
- La citation nette est-elle
lambda
simplement un choix stylistique ou existe-t-il des circonstances dans lesquelles la citation nette est réellement utile? - Y a-t-il des circonstances dans lesquelles nous ne devons pas citer de façon précise a
lambda
, c'est-à-dire lorsque cela changerait le sens du code?
lambda
a été défini comme une macro qui ajoute lefunction
for aussi loin que possible. Si l'OIE#'
a été nécessaire à un moment donné, c'était dans le code de développement très précoce. Il n'était certainement pas nécessaire déjà dans Emacs-18.Puisque
lambda
ne fait pas de sens quand il est pas cité, les versions récentes de suivi Emacs Lisp (ANSI) Common Lisp dans l' interprétation non cotées(lambda...)
comme#'(lambda...)
. Les deux notations sont presque exactement équivalentes (sauf dans la structure citée).Que ce soit à préférer
(lambda...)
ou#'(lambda...)
est donc purement une question de style. Certaines personnes préfèrent la forme nue, ce qui évite le bruit syntaxique, tandis que d'autres (y compris moi-même) préfèrent la forme citée.la source
Ajouter un peu d'histoire supplémentaire, en raison de voir l' héritage historique de # '(lambda ...)?
https://debbugs.gnu.org/cgi/bugreport.cgi?bug=4290 suggère que:
Je ne connais pas le compilateur d'octets, mais je peux voir qu'au moins dès 1993, la
lambda
macro elle-même a renvoyé un(function (lambda ...))
formulaire.https://www.iro.umontreal.ca/~monnier/hopl-4-emacs-lisp.pdf dit également:
la source
Je veux juste donner un exemple pratique d'utilisation de l'expression lambda réticulaire. Il s'agit de liaison lexicale / de l'observation de variables, l'utilisation d'une expression lambda rétroactive et le référencement de variables avec une virgule permettent d'obtenir leur valeur globale.
M-x [RET] eval-buffer
sorties "Random old"M-x [RET] eval-buffer
sorties "aléatoire"Un troisième exemple combinant variable globale et variable locale de variable
M-x [RET] eval-buffer
sorties "Random" "Random old"la source