P: ¿ Cuándo, si alguna vez, es útil citar con precisión a lambda
, y cuándo, si alguna vez, no debemos citar con precisión a lambda
?
Las personas usan lambda
s de tres maneras:
- llanura:
(lambda (x) x)
- citado:
'(lambda (x) x)
- comillas afiladas:
#'(lambda (x) x)
Este subproceso SO analiza los tres tipos, este subproceso SO explica por qué no se debe citar (NB: no una comilla nítida ) lambda
, y este subproceso SO también discute las distinciones entre comillas y comillas nítidas.
Ahora, el nodo manual sobre funciones anónimas y la cadena de documentación para lambda
tener en cuenta que los lambda
s son autocomillas
Una llamada de la forma
(lambda ARGS DOCSTRING INTERACTIVE BODY)
es auto citando; El resultado de evaluar la expresión lambda es la expresión misma. La expresión lambda se puede tratar como una función ...
Entonces, parece que (lambda (x) x)
y #'(lambda (x) x)
son equivalentes, pero '(lambda (x) x)
no lo es (lo más importante, cuando se compila byte).
Parece que uno raramente querría citar un lambda
, pero no me queda claro cuándo, si alguna vez, deberíamos, o no, citar con nitidez:
- ¿Las comillas afiladas son
lambda
simplemente una elección estilística, o hay circunstancias en las que las comillas afiladas son realmente útiles? - ¿Hay circunstancias en las que tenemos que no afilada citar una
lambda
, es decir, cuando se hace de manera alteraría el significado del código?
lambda
se ha definido como una macro que agrega lofunction
más atrás posible. IOW si#'
se ha necesitado en algún momento, estaba en un código de desarrollo muy temprano. Seguro que no era necesario ya en Emacs-18.Dado
lambda
que no tiene ningún sentido cuando no se cita, las versiones recientes de Emacs Lisp siguen (ANSI) Common Lisp para interpretar sin comillas(lambda...)
como#'(lambda...)
. Las dos notaciones son casi exactamente equivalentes (excepto dentro de la estructura citada).Ya sea que prefiera
(lambda...)
o#'(lambda...)
sea, por lo tanto, una cuestión de estilo. Algunas personas prefieren la forma desnuda, que evita el ruido sintáctico, mientras que otras (incluido yo mismo) prefieren la forma citada.fuente
Agregando un poco de historia adicional, a causa de ver ¿Es el legado histórico # '(lambda ...)?
https://debbugs.gnu.org/cgi/bugreport.cgi?bug=4290 sugiere que:
No sé sobre el compilador de bytes, pero puedo ver que, al menos desde 1993, la
lambda
macro misma devolvió un(function (lambda ...))
formulario.https://www.iro.umontreal.ca/~monnier/hopl-4-emacs-lisp.pdf también dice:
fuente
Solo quiero dar un ejemplo práctico del uso de la expresión lambda backtic. Se trata del enlace léxico / sombreado de variables, el uso de una expresión lambda backtic y la referencia de variables con una coma hace posible obtener su valor global.
M-x [RET] eval-buffer
salidas "Aleatorio antiguo"M-x [RET] eval-buffer
salidas "Aleatorio"Un tercer ejemplo que combina la variable global y la variable local de variable
M-x [RET] eval-buffer
salidas "Aleatorio" "Aleatorio antiguo"fuente