emacs / elisp: a cosa serve il simbolo cancelletto (cancelletto, segno di numero, octothorp)?


102

Cosa fa questo?

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

... ed è diverso da

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

Risposte:


98

Non c'è differenza:

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

i rendimenti t

La #può essere utilizzato a fronte di uno lambdaespressione che indica al byte-compilatore che la seguente espressione può essere compilato byte, vedere la documentazione per funzioni anonime . Ma non c'è niente da compilare nel caso di un simbolo.

In generale, viene utilizzato nella rappresentazione stampata insieme alla parentesi angolare sinistra (<) per indicare che l'oggetto stampato è una descrizione (ma non può essere letto). Per esempio:

#<buffer foo.txt>

Viene anche utilizzato nei costrutti dal lettore per rappresentare strutture circolari. Consulta i documenti per Read Syntax for Circular Objects .

E poi hai il suo uso per denotare la base per interi , ad es #x2c -> 44.

E di più ne sono sicuro.


12
Secondo questo articolo , una buona ragione per applicare #a un simbolo solitario è ottenere la diagnostica in fase di compilazione se quel simbolo non è definito.
ajk

3
Non è proprio vero che "non c'è niente da compilare nel caso di un simbolo". Il compilatore di byte interpreta # 'car per significare "Mi riferisco sempre alla funzione` foo', non al simbolo foo ". Può quindi effettivamente inline la definizione di foo nell'output compilato a byte. (Modifica: no, in realtà è sbagliato. Il simbolo # 'non sarà compilato in byte in modo diverso dal simbolo' - è solo un indicatore di intenti.)
Jonathan Tomer

11
Forse ancora menzionare che 'symbolrappresenta (quote symbol)e #'symbolrappresenta (function symbol)sintatticamente.
tripleee

27

La lista dovrebbe essere completa può essere trovata all'inizio dell'indice di riferimento lisp di Emacs .

Modifica : o ancora più comodamente, dall'interno di Emacs stesso:

  • M-x info RET (apri il browser delle informazioni)

  • d m elisp RET (apri il manuale di elisp)

  • I # RET(elenca le voci per #nell'indice)


25

Ho trovato questa domanda mentre cercavo cosa significasse l'hash in qualcosa che ho trovato durante l'hacking mode-line-format:

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

che è un formato utilizzato per le proprietà del testo nelle stringhe dove:

  • "-%-", testo da correggere: un trattino e una % -construct che risulta in "trattini sufficienti a riempire il resto della riga della modalità", risultando nel famoso Emacs ------.
  • 0, il primo carattere su cui si applicano le proprietà del testo.
  • 3, l'ultimo carattere su cui si applicano le proprietà del testo, ovvero l'intero "-%-".
  • (help-echo "..."), una proprietà e una stringa come argomento.

Questo può essere creato con la propertizefunzione :

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

(inserisci (corretto "Passa il mouse su di me!" 'help-echo' "Congratulazioni!"))

sarebbe lo stesso di #("Hover over me!" 0 14 (help-echo "Congratulations!")):

Piccolo esempio.

Se stai utilizzando la modalità di blocco dei caratteri, l'utilizzo del buffer-substringcomando potrebbe produrre qualcosa del genere:

(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))

Quindi potresti creare qualcosa come:

Visualizzazione della corrispondente funzione di proprietà per più proprietà.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.