Ich sehe scharfe Anführungszeichen im eLisp-Code anderer Leute, und ich benutze sie selbst, aber ich bin mir nicht ganz sicher, wann sie angemessen sind und wann nicht.
Könnte jemand genau klären, wann es angebracht ist, scharfe Anführungszeichen zu verwenden und wann stattdessen normale einfache Anführungszeichen verwendet werden sollten?
#'
mit Lambda (wobei die Antwort im Grunde "nie" lautet), während die Frage von @ izkon eher für die Verwendung von#'
Symbolen gilt.Antworten:
#'
ist nur eine Abkürzung fürfunction
, genauso wie'
eine Abkürzung fürquote
.Sie können es überall dort verwenden, wo Sie dem Byte-Compiler oder dem Interpreter oder einem menschlichen Leser anzeigen möchten, dass sein Argument eine Funktion sein soll (als solche behandelt wird).
In vielen Kontexten bestimmt der Kontext, wie das Argument behandelt wird, wenn Sie es beispielsweise einfach zitieren (verwenden
quote
oder'
) anstatt verwenden#'
(oderfunction
). In einem Kontext, in dem ein Symbol nur für seinesymbol-function
Eigenschaft verwendet wird, dh als Funktion verwendet wird, können Sie das Symbol einfach übergeben (z. B. durch Zitieren oder Übergeben einer Variablen, deren Wert das Symbol ist).Aber manchmal ist Code klarer, wenn Sie ihn
#'
in solchen Kontexten verwenden. Selbst wenn Emacs-Lisp selbst versteht, dass das Symbol in solchen Kontexten als Funktion verwendet wird, kann es hilfreich sein, dies für einen menschlichen Leser des Codes hervorzuheben.In einigen anderen Lisps kann die Behandlung von Lambda-Formen, die einfach (mit
'
) oder nicht zitiert werden, von ihrer Verwendung in einer Funktionsposition abweichen, wenn sie mitfunction
(#'
) zitiert werden . Aber nicht in Emacs Lisp. In Emacs Lisp müssen Sie kein Lambda-Formular (mit'
oder#'
) zitieren , das als Funktion (und nicht nur als Liste) behandelt werden soll. Wenn Sie möchten, dass es nur als Liste, mit Autolambda
usw. behandelt wird, zitieren Sie es (mit'
) - das folgende Beispiel veranschaulicht dies.Von (elisp) anonymen Funktionen :
quelle
#'
(akafunction
) kann vor verwendet werden, ist dort(lambda ...)
jedoch überflüssig. Der einzige Ort, an dem es wirklich sinnvoll ist, befindet sich vor einem Symbol, wie in#'car
. In elisp,#'car
und'car
fast völlig gleichwertig sind, so eine der Hauptzweck einfach ist die Absicht zu dokumentieren (dh , um anzuzeigen , wer auch immer diesen Code liest , dass Sie dieses Symbol als eine Funktion verwenden möchten). Es gibt jedoch einige Umstände, unter denen der Unterschied bedeutender ist:#'car
prüft beim Schreiben , ob siecar
als Funktion vorhanden ist. Wenn er sie nicht findet, gibt er eine Warnung aus, genau wie bei einem Aufruf dieser Funktion .Innerhalb
cl-flet
undcl-labels
kann nur#'f
auf die lokal definierte Funktion verweisenf
, da'f
immer noch auf das globale Symbol verwiesen wirdf
(und welche Funktion auch immer in seinemsymbol-function
Steckplatz gespeichert sein mag ). Z.Bquelle