#'
é apenas uma abreviação para function
, assim como '
é uma abreviação para quote
.
Você pode usá-lo em qualquer lugar onde queira indicar ao compilador de bytes ou ao intérprete ou a um leitor humano que seu argumento deve ser (é tratado como) uma função.
Em muitos contextos, o contexto determina como o argumento é tratado se, por exemplo, você simplesmente o citar (use quote
ou '
) em vez de usar #'
(ou function
). Por exemplo, em um contexto em que um símbolo é usado apenas para sua symbol-function
propriedade, ou seja, é usado como uma função, você pode simplesmente passar o símbolo (por exemplo, citando-o ou passando uma variável cujo valor é o símbolo).
Mas, às vezes, o código é mais claro se você usar #'
em tais contextos. Mesmo que o próprio Emacs-Lisp entenda que o símbolo é usado como uma função em tais contextos, isso pode ajudar a enfatizar isso para um leitor humano do código.
Em alguns outros Lisps, o tratamento de formulários lambda que são simplesmente citados (com '
) ou não citados pode diferir do uso em uma posição de função quando citados usando function
( #'
). Mas não no Emacs Lisp. No Emacs Lisp, você não precisa citar (usando um '
ou #'
) um formulário lambda que deseja tratar como uma função (e não simplesmente como uma lista). Se você deseja que ele seja tratado apenas como uma lista, com carro lambda
, etc., cite-o (com '
) - o exemplo abaixo ilustra isso.
Funções anônimas do (elisp) :
- Formulário especial: function
function-object
Este formulário especial retorna FUNCTION-OBJECT
sem avaliá-lo.
Nisso, é semelhante a quote
(* note Quoting: :). Mas quote
, diferentemente
, também serve como uma nota para o avaliador do Emacs e o compilador de bytes que FUNCTION-OBJECT
se destina a ser usado como uma função. Supondo que FUNCTION-OBJECT
seja uma expressão lambda válida, isso tem dois efeitos:
• Quando o código é FUNCTION-OBJECT
compilado em bytes , ele é compilado em um objeto de função de código de bytes (* note Compilação de bytes: :).
• Quando a ligação lexical está ativada, FUNCTION-OBJECT
é convertida em um fechamento. * Nota Encerramentos ::.
A sintaxe de leitura #'
é um atalho para uso function
. Os seguintes formulários são todos equivalentes:
(lambda (x) (* x x))
(function (lambda (x) (* x x)))
#'(lambda (x) (* x x))
No exemplo a seguir, definimos uma change-property
função que aceita uma função como seu terceiro argumento, seguida por uma double-property
função que faz uso change-property
dela passando uma função 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))))
Observe que não citamos o lambda
formulário.
Se você compilar o código acima, a função anônima também será compilada. Isso não aconteceria se, digamos, você tivesse construído a função anônima, citando-a como uma lista:
(defun double-property (symbol prop)
(change-property symbol prop '(lambda (x) (* 2 x))))
Nesse caso, a função anônima é mantida como uma expressão lambda no código compilado. O compilador de bytes não pode assumir que esta lista seja uma função, mesmo que pareça uma, pois não sabe que
change-property
pretende usá-la como uma função.