emacs lisp elisp common-lisp

¿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 la function . 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, la function 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

pero parecen sugerir que el #'' es innecesario, al menos en las lambdas.