#'
jest po prostu skrótem function
, tak jak '
jest skrótem dla quote
.
Możesz go użyć w dowolnym miejscu, w którym chcesz wskazać kompilatorowi bajtów, interpreterowi lub czytelnikowi, że jego argument ma być (jest traktowany) funkcją.
W wielu kontekstach kontekst określa sposób traktowania argumentu, jeśli na przykład po prostu go zacytujesz (użyj quote
lub '
) zamiast używać #'
(lub function
). Na przykład w kontekście, w którym symbol jest używany tylko ze względu na jego symbol-function
właściwość, tj. Jest używany jako funkcja, możesz po prostu przekazać symbol (np. Przez zacytowanie go lub przekazanie zmiennej, której wartością jest symbol).
Ale czasami kod jest wyraźniejszy, jeśli używasz go #'
w takich kontekstach. Nawet jeśli sam Emacs-Lisp rozumie, że symbol jest używany jako funkcja w takich kontekstach, może to pomóc w podkreśleniu tego dla ludzkiego czytelnika kodu.
W niektórych innych Lisps, traktowanie form lambda, które są po prostu cytowane (z '
) lub nie są cytowane, może różnić się od ich użycia w pozycji funkcyjnej, gdy jest cytowany za pomocą function
( #'
). Ale nie w Emacs Lisp. W Emacs Lisp nie musisz zacytować (za pomocą albo '
i #'
) formularz lambda, które mają być traktowane jako funkcja (a nie po prostu jako listę). Jeśli chcesz, aby była traktowana jak lista, z samochodem lambda
itp., To zacytuj ją (z '
) - ilustruje to poniższy przykład.
Od (elisp) Funkcje anonimowe :
- Formularz specjalny: function
function-object
Ten specjalny formularz powraca FUNCTION-OBJECT
bez jego oceny.
Pod tym względem jest podobny do quote
(* notatka Cytowanie: :). Ale w przeciwieństwie do tego
quote
, służy również jako uwaga dla ewaluatora Emacsa i kompilatora bajtów, który FUNCTION-OBJECT
ma być używany jako funkcja. Zakładając, że FUNCTION-OBJECT
jest poprawnym wyrażeniem lambda, ma to dwa skutki:
• Gdy kod jest skompilowany bajtowo, FUNCTION-OBJECT
jest kompilowany w obiekt funkcji bajt-kod (* uwaga Kompilacja bajtów: :).
• Gdy włączone jest powiązanie leksykalne, FUNCTION-OBJECT
jest konwertowane na zamknięcie. * Uwaga Zamknięcia ::.
Składnia odczytu #'
jest skrótem do użycia function
. Następujące formularze są równoważne:
(lambda (x) (* x x))
(function (lambda (x) (* x x)))
#'(lambda (x) (* x x))
W poniższym przykładzie definiujemy change-property
funkcję, która przyjmuje funkcję jako trzeci argument, a następnie double-property
funkcję, która korzysta z change-property
niej, przekazując jej funkcję anonimową:
(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))))
Pamiętaj, że nie podajemy lambda
formularza.
Jeśli skompilujesz powyższy kod, anonimowa funkcja również zostanie skompilowana. Nie stanie się tak, jeśli, powiedzmy, skonstruowałeś funkcję anonimową, cytując ją jako listę:
(defun double-property (symbol prop)
(change-property symbol prop '(lambda (x) (* 2 x))))
W takim przypadku anonimowa funkcja jest przechowywana jako wyrażenie lambda w skompilowanym kodzie. Kompilator bajtów nie może założyć, że ta lista jest funkcją, chociaż wygląda jak jedna, ponieważ nie wie, że
change-property
zamierza użyć jej jako funkcji.