#'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 quotelub ') 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-functionwł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 lambdaitp., To zacytuj ją (z ') - ilustruje to poniższy przykład.
Od (elisp) Funkcje anonimowe :
- Formularz specjalny: function function-object
Ten specjalny formularz powraca FUNCTION-OBJECTbez 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-OBJECTma być używany jako funkcja. Zakładając, że FUNCTION-OBJECTjest poprawnym wyrażeniem lambda, ma to dwa skutki:
• Gdy kod jest skompilowany bajtowo, FUNCTION-OBJECTjest kompilowany w obiekt funkcji bajt-kod (* uwaga Kompilacja bajtów: :).
• Gdy włączone jest powiązanie leksykalne, FUNCTION-OBJECTjest 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-propertyfunkcję, która przyjmuje funkcję jako trzeci argument, a następnie double-property
funkcję, która korzysta z change-propertyniej, 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 lambdaformularza.
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-propertyzamierza użyć jej jako funkcji.