texto - emacs source code
¿Cuándo se debe usar la sintaxis de la función Emacs#''? (3)
Básicamente, ¿cuándo debería usar el procedimiento de function
Emacs Lisp? No he encontrado ningún ejemplo en el que haya una diferencia en el comportamiento si pasa funciones como argumentos ''like-this
o #''like-this
. De hecho, si evalúo (eq ''goto-char #''goto-char)
devuelve t
.
El código de Emacs Lisp que he encontrado rara vez usa la function
/ #''
; los autores solo quote
/ ''
todo.
Ejemplo: (add-hook ''emacs-lisp-hook ''turn-on-eldoc-mode)
Sin embargo, puedo encontrar algunos contraejemplos. Aquí hay uno del código fuente de electric.el
de Emacs 24.3:
(add-hook ''post-self-insert-hook
#''electric-indent-post-self-insert-function
''append)
Conjeturas y más preguntas:
- ¿Es solo una convención estilística Lisp-2?
- ¿Tiene que ver con la compilación de bytes?
- ¿Solo le importa a los escritores de la biblioteca? ¿Te gustaría que tu código se ejecutara en una gran cantidad de entornos y versiones de Emacs? (El corolario sería si solo estás "retocando los archivos dotf", entonces no tienes que preocuparte por todo esto).
- ¿Cuándo debería citar lambda-expressions? ¿Cuándo puedo dejarlos sin comillas?
Por ejemplo,(do-something ''(lambda …
versus(do-something (lambda …
- ¿Hubo alguna limitación en una versión anterior de Emacs que dio lugar a estas facetas de elisp? Al igual que, ¿puedo ignorar la diferencia entre
''
y#''
en la medida en que estoy usando una versión de Emacs más reciente que X ?
En elisp #''
está (en efecto) puramente sobre compilación de bytes ( edición: y desde Emacs 24, también cierres léxicos ); pero probablemente nunca más necesites usarlo.
#''...
es abreviado para (function ...)
que es simplemente una variante de ''...
/ (quote ...)
que también insinúa al compilador de bytes que puede compilar el formulario citado como función.
Sin embargo, en Emacs modernos (IIRC no fue siempre el caso), (lambda ...)
es equivalente a #''(lambda ...)
, así que creo que raramente (si es que alguna vez) necesitaría escribir #''
.
Rara vez querría usar ''(lambda ...)
, por las razones que Stefan ha elaborado (pero ''symbol
está bien).
Esto se trata en el manual bajo Ch i g (elisp) Anonymous Functions
RET (aunque parece haber un error en la última parte del código de ejemplo, ya que es idéntico al ejemplo anterior (en Emacs 24.3.1)).
(nb La respuesta de Stefan es definitiva, pero la conservaré aquí porque espero que la complemente).
function
(alias #''
) se usa para presupuestar funciones, mientras que la quote
(alias ''
) se utiliza para citar datos. Ahora, en Emacs-Lisp, un símbolo cuya celda de función es una función es en sí misma una función, así que #''symbol
es lo mismo que ''symbol
en la práctica (aunque la intención es diferente, el primero deja claro que uno no solo está hablando sobre el símbolo "símbolo" pero sobre la función llamada "símbolo").
El lugar donde la diferencia no es solo estilística es cuando se cita lambdas: ''(lambda ...)
es una expresión que evalúa a una lista cuyo primer elemento es el símbolo lambda
. Se le permite aplicar cosas como car
y cdr
, pero no debe llamarlo como si fuera una función (aunque en la práctica tiende a funcionar bien). Por el contrario, #''(lambda ...)
(que se puede escribir simplemente (lambda ...)
) es una expresión que se evalúa como una función . Eso significa que no puede aplicarle el car
, pero el compilador de bytes puede mirar dentro de #''(lambda ...)
, realizar una macro-expansión en él, advertirle si lo que encuentra no se ve como kosher, etc. .; Para la vinculación léxica, incluso tiene que mirar dentro para encontrar las variables libres a las que se refiere esa función.
Además de las diferencias al citar (lambda ...)
formularios, recientemente (a partir de Emacs 24.4) ha habido un cambio en bytecomp.el tal que se genera una advertencia cuando se usa un formulario de #''symbol
, pero la función no es conocido para ser definido al final de la compilación.
Escribir todos los símbolos de función con la sintaxis de #''symbol
función-cita #''symbol
lugar de la sintaxis de ''symbol
es, por lo tanto, algo preferible, ya que permite que el compilador de bytes compruebe si ha utilizado nombres de función que están realmente definidos.
Anteriormente (Emacs 24.3 y anteriores), mientras que el compilador de bytes advertía cuando llamabas a una función como (no-such-function ...)
y no se definía o importaba limpiamente desde otro archivo, algo así como (mapcar #''no-such-function ...)
habría producido solo un error de tiempo de ejecución sin una advertencia de tiempo de compilación.
El cambio significa que ambos escenarios ahora producen advertencias en tiempo de compilación; sin embargo, si usa (mapcar ''no-such-function ...)
sin usar la función de cotización, entonces, una vez más, no se puede generar ninguna advertencia en tiempo de compilación. Entonces, el #''
puede ayudar a encontrar errores (probablemente errores tipográficos) temprano.
La función de cotización también ayuda con un estilo de programación de arriba hacia abajo, ya que el compilador de bytes enumerará las funciones que aún no ha implementado (pero omitirá las funciones especificadas con una cotización normal).