#'
se acaba de taquigrafía para function
, al igual que '
es la abreviatura de quote
.
Puede usarlo en cualquier lugar donde desee indicar al compilador de bytes o al intérprete o un lector humano que se espera que su argumento sea (se trata como) una función.
En muchos contextos, el contexto determina cómo se trata el argumento si, por ejemplo, simplemente lo cita (use quote
o '
) en lugar de usar #'
(o function
). Por ejemplo, en un contexto en el que un símbolo se usa solo para su symbol-function
propiedad, es decir, se usa como una función, puede pasar el símbolo (por ejemplo, al citarlo o al pasar una variable cuyo valor es el símbolo).
Pero a veces el código es más claro si lo usa #'
en tales contextos. Incluso si Emacs-Lisp mismo entiende que el símbolo se usa como una función en tales contextos, podría ayudar enfatizar esto para un lector humano del código.
En algunos otros Lisps, el tratamiento de formas lambda que simplemente se citan (con '
) o no se pueden citar de su uso en una posición de función cuando se citan usando function
( #'
). Pero no en Emacs Lisp. En Emacs Lisp no necesita citar (usando uno '
o más #'
) un formulario lambda que desee que se trate como una función (y no simplemente como una lista). Si desea que se maneje solo como una lista, con automóvil lambda
, etc., cítelo (con '
); el siguiente ejemplo ilustra esto.
De (elisp) Funciones anónimas :
- Forma especial: function
function-object
Este formulario especial regresa FUNCTION-OBJECT
sin evaluarlo.
En esto, es similar a quote
(* note Quoting: :). Pero a diferencia
quote
, también sirve como una nota para el evaluador de Emacs y el compilador de bytes que FUNCTION-OBJECT
está destinado a ser utilizado como una función. Suponiendo que FUNCTION-OBJECT
es una expresión lambda válida, esto tiene dos efectos:
• Cuando el código se FUNCTION-OBJECT
compila en bytes , se compila en un objeto de función de código de bytes (* nota Compilación de bytes: :).
• Cuando el enlace léxico está habilitado, FUNCTION-OBJECT
se convierte en un cierre. * Nota Cierres ::.
La sintaxis de lectura #'
es una abreviatura para usar function
. Las siguientes formas son todas equivalentes:
(lambda (x) (* x x))
(function (lambda (x) (* x x)))
#'(lambda (x) (* x x))
En el siguiente ejemplo, definimos una change-property
función que toma una función como su tercer argumento, seguida de una double-property
función que utiliza change-property
al pasarle una función anónima:
(defun change-property (symbol prop function)
(let ((value (get symbol prop)))
(put symbol prop (funcall function value))))
(defun double-property (symbol prop)
(change-property symbol prop (lambda (x) (* 2 x))))
Tenga en cuenta que no citamos el lambda
formulario.
Si compila el código anterior, la función anónima también se compila. Esto no sucedería si, por ejemplo, hubiera construido la función anónima citándola como una lista:
(defun double-property (symbol prop)
(change-property symbol prop '(lambda (x) (* 2 x))))
En ese caso, la función anónima se mantiene como una expresión lambda en el código compilado. El compilador de bytes no puede asumir que esta lista es una función, aunque parezca una, ya que no sabe si change-property
tiene la
intención de utilizarla como una función.