emacs / elisp: Para que é usado o símbolo hash (libra, sinal numérico, octothorp)?

102

O que isso faz?

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

... e é diferente de

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

Respostas:

98

Não há diferença:

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

rendimentos t

O #pode ser usado na frente de uma lambdaexpressão indicando ao compilador de byte que a seguinte expressão pode ser compilada por byte, consulte a documentação de Funções anônimas . Mas não há nada para compilar no caso de um símbolo.

Em geral, é usado na representação impressa junto com o colchete angular esquerdo (<) para indicar que o objeto impresso é uma descrição (mas não pode ser lido). Por exemplo:

#<buffer foo.txt>

Ele também é usado em construções pelo leitor para representar estruturas circulares. Consulte os documentos de Read Syntax for Circular Objects .

E então você tem seu uso para denotar a base para inteiros , por exemplo #x2c -> 44.

Além disso, tenho certeza.

Trey Jackson
fonte
12
De acordo com este artigo , uma boa razão para aplicar #a um símbolo solitário é obter diagnósticos em tempo de compilação se esse símbolo for indefinido.
ajk
3
Não é bem verdade que "não há nada para compilar no caso de um símbolo". O compilador de bytes interpreta # 'car como "Estou sempre me referindo à função` foo', não ao símbolo foo. " Ele pode, então, embutir a definição de foo na saída compilada por byte. (Edit: não, isso está realmente errado. # 'Símbolo não será compilado por byte de forma diferente de' símbolo - é apenas um marcador de intenção.)
Jonathan Tomer
11
Talvez ainda mencione que 'symbolrepresenta (quote symbol)e #'symbolrepresenta (function symbol)sintaticamente.
tripleee
27

A lista deve ser abrangente pode ser encontrada no topo do índice de referência lisp do Emacs .

Edit : Ou ainda mais convenientemente, de dentro do próprio Emacs:

  • M-x info RET (abra o navegador de informações)

  • d m elisp RET (abra o manual elisp)

  • I # RET(liste as entradas #no índice)

phils
fonte
25

Eu encontrei esta pergunta enquanto procurava o que o hash significa em algo que encontrei durante o hacking mode-line-format:

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

que é um formato usado para propriedades de texto em strings onde:

  • "-%-", texto a ser propertizado: um traço e um % -construct que resulta em "traços suficientes para preencher o restante da linha de modo", resultando no famoso Emacs ------.
  • 0, o primeiro caractere ao qual as propriedades do texto se aplicam.
  • 3, o último caractere ao qual as propriedades do texto se aplicam, ou seja , o todo "-%-".
  • (help-echo "..."), uma propriedade e uma string como seu argumento.

Isso pode ser criado com a propertizefunção :

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

(insira (propertize "Passe o mouse sobre mim!" 'help-echo' "Parabéns!"))

seria o mesmo que #("Hover over me!" 0 14 (help-echo "Congratulations!")):

Pequeno exemplo.

Se você estiver usando o modo de bloqueio de fonte, o uso do buffer-substringcomando pode produzir algo assim:

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

Então você pode criar algo como:

Mostrando a função de propriedade correspondente para várias propriedades.

Islândia_jack
fonte