¿Por qué usar#''antes de los argumentos de la función en emacs-lisp?
elisp common-lisp (1)
El carácter de comillas en #''foo
no tiene nada que ver con el de ''foo
.
#''foo
se reemplaza en tiempo de lectura por (function foo)
. Cuando se compila y ejecuta, busca la definición funcional nombrada por foo
(por defun
, flet
, labels
o similar).
''foo
se reemplaza en el momento de la lectura por (quote foo)
. Cuando se compila y ejecuta, simplemente se reemplaza por el símbolo foo
.
Funcall
y apply
(y, por lo tanto, en general, funciones de orden superior) toman los designadores de función como argumentos. Un designador de función puede ser una función o un símbolo que da nombre a una función, por lo que #''foo
y ''foo
son designadores de función.
Por lo tanto, las formas ''foo
y #''foo
parecen intercambiables a primera vista. Sin embargo, la búsqueda de la función real se realiza en diferentes momentos: #''foo
se busca donde se invoca, mientras que la función nombrada por ''foo
solo se buscará cuando finalmente se aplique.
Si usa un designador de función muchas veces, es mucho más eficiente hacer la búsqueda solo una vez, o incluso solo en tiempo de compilación. Esto puede ser un gran ahorro de tiempo, y se traduce en una experiencia de usuario más suave en un editor.
Estoy familiarizado con Emacs Lisp, pero no con Lisp común (o cualquier otro). Algunos programadores Lisp sugieren (por ejemplo, una función básica para emacs ) que es bueno usar #''
delante de los argumentos de la función en el código Lisp. Por ejemplo:
(mapc #''my-fun ''(1 2 3))
En Emacs Lisp, creo que esto es equivalente a
(mapc ''my-fun ''(1 2 3))
Del manual elisp, sección 12.7.
La sintaxis de lectura
#''
es una mano corta para usar lafunction
. Las siguientes formas son todas equivalentes:
(lambda (x) (* x x)) (function (lambda (x) (* x x))) #''(lambda (x) (* x x))
y la ayuda para la function
La función es una forma especial en
eval.c
(function ARG)
Como
quote
, pero preferido para objetos que son funciones. En la compilación de bytes, lafunction
hace que su argumento sea compilado.quote
no puede hacer eso.
Así que parece una optimización potencial, pero no más. Además, proveniente de un fondo de ML / Haskell, parece extraño tratar una función de manera diferente a cualquier otro dato.
Pregunta:
¿Está de acuerdo en que #''
debe usarse en los argumentos de la función emacs-lisp
? (Una breve explicación de por qué son necesarios en Common Lisp también sería genial).
Notas:
Pensé que podría leer una celda diferente cuando se omite el #''
(función valor / función). Pero esto parece incorrecto porque la documentación de la function
no dice nada sobre la captura de la célula de función. Esto se logra mediante el uso symbol-function
.
Preguntas relacionadas son
- El # ''en común
- Escribiendo expresiones lambda en común
- ¿Por qué # ''se usa antes de lambda en Common Lisp?
pero parecen sugerir que el #''
es innecesario, al menos en las lambdas.