emacs / elisp: Wofür wird das Hash-Symbol (Pfund, Zahlenzeichen, Octothorp) verwendet?

102

Was macht das?

(add-hook 'compilation-mode-hook #'my-setup-compile-mode)

... und ist es anders als

(add-hook 'compilation-mode-hook 'my-setup-compile-mode)
Cheeso
quelle

Antworten:

98

Es gibt keinen Unterschied:

(eq 'my-add #'my-add)

ergibt t

Der #kann vor einem lambdaAusdruck verwendet werden, der dem Byte-Compiler angibt, dass der folgende Ausdruck bytekompiliert werden kann. Weitere Informationen finden Sie in den Dokumenten für anonyme Funktionen . Bei einem Symbol gibt es jedoch nichts zu kompilieren.

Im Allgemeinen wird es in der gedruckten Darstellung zusammen mit der linken spitzen Klammer (<) verwendet, um anzuzeigen, dass das gedruckte Objekt eine Beschreibung ist (aber nicht gelesen werden kann). Beispielsweise:

#<buffer foo.txt>

Es wird auch in Konstrukten vom Leser verwendet, um kreisförmige Strukturen darzustellen. Informationen zum Lesen der Syntax für kreisförmige Objekte finden Sie in den Dokumenten .

Und dann können Sie die Basis für ganze Zahlen bezeichnen , z #x2c -> 44.

Plus mehr bin ich sicher.

Trey Jackson
quelle
12
Laut diesem Artikel besteht ein guter Grund für die Anwendung #auf ein einzelnes Symbol darin, zur Kompilierungszeit eine Diagnose zu erhalten, wenn dieses Symbol nicht definiert ist.
Ajk
3
Es ist nicht ganz richtig, dass "im Fall eines Symbols nichts zu kompilieren ist". Der Byte-Compiler interpretiert # 'car als "Ich beziehe mich immer auf die Funktion" foo ", nicht auf das Symbol foo." Es kann dann tatsächlich die Definition von foo in der bytekompilierten Ausgabe einbinden. (Bearbeiten: Nein, das ist tatsächlich falsch. # 'Symbol wird nicht anders als' Symbol bytekompiliert - es ist nur ein Zeichen der Absicht.)
Jonathan Tomer
11
Vielleicht noch erwähnen, dass dies syntaktisch 'symboldarstellt (quote symbol)und #'symboldarstellt (function symbol).
Tripleee
27

Die umfassende Liste finden Sie oben im Emacs-Lisp-Referenzindex .

Bearbeiten : Oder noch bequemer aus Emacs heraus:

  • M-x info RET (Öffnen Sie den Info-Browser)

  • d m elisp RET (Öffnen Sie das Elisp-Handbuch)

  • I # RET(Listen Sie die Einträge #im Index auf)

Phils
quelle
25

Ich habe diese Frage gefunden, als ich nach dem gesucht habe, was der Hash in etwas bedeutet, das ich beim Hacken gefunden habe mode-line-format:

#("-%-" 0 3
  (help-echo "Display as tooltip when mouse hovers or with display-local-help."))

Dies ist ein Format, das für Texteigenschaften in Zeichenfolgen verwendet wird, wobei:

  • "-%-", zu ordnender Text: Ein Strich und ein % -Konstrukt , die zu "Strichen führen, die ausreichen, um den Rest der Moduszeile zu füllen", was zu den berühmten Emacs führt ------.
  • 0, das erste Zeichen, auf das die Texteigenschaften angewendet werden.
  • 3, das letzte Zeichen, auf das die Texteigenschaften angewendet werden, dh das gesamte "-%-".
  • (help-echo "..."), eine Eigenschaft und eine Zeichenfolge als Argument.

Dies kann mit der propertizeFunktion erstellt werden :

(propertize "Hover over me!" 'help-echo '"congratulations!")

(einfügen (Eigenschaft "Schwebe über mir!" 'Hilfe-Echo' "Herzlichen Glückwunsch!")

wäre das gleiche wie #("Hover over me!" 0 14 (help-echo "Congratulations!")):

Kleines Beispiel.

Wenn Sie den Schriftsperrmodus verwenden, kann die Verwendung des buffer-substringBefehls Folgendes bewirken:

(buffer-substring 1 28) ; First 27 characters in the current buffer
  #(";; This buffer is for notes"
     0 3
     (fontified t face font-lock-comment-delimiter-face)
     3 27
     (fontified t face font-lock-comment-face))

Sie könnten also so etwas wie Folgendes erstellen:

Anzeigen der entsprechenden Eigenschaftsfunktion für mehrere Eigenschaften.

Island_jack
quelle