#'
è solo una scorciatoia per function
, proprio come '
è una scorciatoia per quote
.
Puoi usarlo ovunque tu voglia indicare al compilatore di byte, all'interprete o ad un lettore umano che il suo argomento dovrebbe essere (viene trattato come) una funzione.
In molti contesti il contesto determina come viene trattato l'argomento se, ad esempio, lo si cita semplicemente (usa quote
o '
) invece di usare #'
(o function
). Ad esempio, in un contesto in cui un simbolo viene utilizzato solo per la sua symbol-function
proprietà, ovvero viene utilizzato come una funzione, è possibile passare semplicemente il simbolo (ad es. Citandolo o passando una variabile il cui valore è il simbolo).
Ma a volte il codice è più chiaro se lo si utilizza #'
in tali contesti. Anche se Emacs-Lisp stesso comprende che il simbolo è usato come funzione in tali contesti, potrebbe aiutare a enfatizzarlo per un lettore umano del codice.
In alcune altre Lisps, il trattamento di forme lambda che sono semplicemente citate (con '
) o non quotate possono differire dal loro uso in una posizione di funzione quando quotate using function
( #'
). Ma non in Emacs Lisp. In Emacs Lisp non è necessario citare (usando '
o #'
) un modulo lambda che si desidera venga trattato come una funzione (e non semplicemente come un elenco). Se lo vuoi come un semplice elenco, con auto lambda
ecc., Quindi citalo (con '
) - l'esempio che segue illustra questo.
Da (anisp) Funzioni anonime :
- Modulo speciale: function
function-object
Questo modulo speciale restituisce FUNCTION-OBJECT
senza valutarlo.
In questo, è simile a quote
(* note Quoting: :). Ma a differenza
quote
, funge anche da nota per il valutatore e il compilatore di byte Emacs che FUNCTION-OBJECT
deve essere utilizzato come funzione. Supponendo che FUNCTION-OBJECT
sia una valida espressione lambda, ciò ha due effetti:
• Quando il codice viene FUNCTION-OBJECT
compilato in byte , viene compilato in un oggetto funzione byte-code (* note Compilazione byte: :).
• Quando il legame lessicale è abilitato, FUNCTION-OBJECT
viene convertito in una chiusura. * Note chiusure ::.
La sintassi di lettura #'
è una scorciatoia per l'utilizzo function
. I seguenti moduli sono tutti equivalenti:
(lambda (x) (* x x))
(function (lambda (x) (* x x)))
#'(lambda (x) (* x x))
Nel seguente esempio, definiamo una change-property
funzione che accetta una funzione come terzo argomento, seguita da una double-property
funzione che utilizza change-property
passando una funzione anonima:
(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))))
Si noti che non citiamo il lambda
modulo.
Se si compila il codice sopra, viene compilata anche la funzione anonima. Ciò non accadrebbe se, diciamo, avessi costruito la funzione anonima citandola come un elenco:
(defun double-property (symbol prop)
(change-property symbol prop '(lambda (x) (* 2 x))))
In tal caso, la funzione anonima viene mantenuta come espressione lambda nel codice compilato. Il compilatore di byte non può presumere che questo elenco sia una funzione, sebbene sembri uno, poiché non sa che
change-property
intende utilizzarlo come funzione.