Widzę ostre cytaty używane w kodzie eLisp innych ludzi i używam ich osobiście, ale nie jestem całkowicie pewien, kiedy są odpowiednie, a kiedy nie.
Czy ktoś mógłby wyjaśnić, kiedy właściwe jest stosowanie ostrych cytatów i kiedy zamiast tego należy stosować zwykłe pojedyncze cytaty?
#'
lambda (gdzie odpowiedź jest w zasadzie „nigdy”), podczas gdy pytanie @ izkon dotyczy raczej#'
zastosowania symboli.Odpowiedzi:
#'
jest po prostu skrótemfunction
, tak jak'
jest skrótem dlaquote
.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ć#'
(lubfunction
). Na przykład w kontekście, w którym symbol jest używany tylko ze względu na jegosymbol-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 samochodemlambda
itp., To zacytuj ją (z'
) - ilustruje to poniższy przykład.Od (elisp) Funkcje anonimowe :
źródło
#'
(akafunction
) może być używane przed,(lambda ...)
ale jest tam zbędne, więc jedynym miejscem, w którym ma to naprawdę znaczenie, jest symbol, jak w#'car
. W ELisp#'car
i'car
są prawie całkowicie równoważne, więc jednym z głównych celów jest po prostu udokumentowanie zamiaru (tj. Wskazanie każdemu, kto czyta ten kod, że zamierzasz użyć tego symbolu jako funkcji). Istnieje jednak kilka okoliczności, w których różnica jest bardziej znacząca:#'car
, sprawdzi, czycar
istnieje jako funkcja, a jeśli go nie znajdzie, wyemituje ostrzeżenie, tak jak w przypadku wywołania tej funkcji .Wewnątrz
cl-flet
icl-labels
,#'f
może odnosić się tylko do funkcji zdefiniowanej lokalnief
, ponieważ'f
nadal będzie odnosić się do symbolu globalnegof
(i dowolnej funkcji, która może być zapisana w jejsymbol-function
gnieździe). Na przykładźródło