emacs / elisp: ¿Para qué se utiliza el símbolo de almohadilla (almohadilla, signo de número, octothorp)?

102

¿Qué hace esto?

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

... y es diferente a

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

Respuestas:

98

No hay diferencia:

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

rendimientos t

El #se puede usar delante de una lambdaexpresión que indica al compilador de bytes que la siguiente expresión puede ser compilada por bytes, consulte los documentos para funciones anónimas . Pero no hay nada que compilar en el caso de un símbolo.

En general, se utiliza en la representación impresa junto con el corchete de ángulo izquierdo (<) para indicar que el objeto impreso es una descripción (pero no se puede leer). Por ejemplo:

#<buffer foo.txt>

El lector también lo utiliza en construcciones para representar estructuras circulares. Consulte los documentos para leer la sintaxis para objetos circulares .

Y luego tiene su uso para denotar la base de números enteros , por ejemplo #x2c -> 44.

Y más, estoy seguro.

Trey Jackson
fuente
12
Según este artículo , una buena razón para aplicar #a un símbolo solitario es obtener diagnósticos en tiempo de compilación si ese símbolo no está definido.
ajk
3
No es del todo cierto que "no hay nada que compilar en el caso de un símbolo". El compilador de bytes interpreta que # 'car significa "Siempre me refiero a la función' foo ', no al símbolo foo". Entonces, en realidad, puede incluir la definición de foo en la salida compilada por bytes. (Editar: no, eso es realmente incorrecto. El símbolo # 'no se compilará en bytes de manera diferente al símbolo'; es solo un marcador de intención).
Jonathan Tomer
11
Quizás todavía mencionar que 'symbolrepresenta (quote symbol)y #'symbolrepresenta (function symbol)sintácticamente.
tripleee
27

La lista debería ser completa se puede encontrar en la parte superior del índice de referencia lisp de Emacs .

Editar : O incluso más convenientemente, desde el propio Emacs:

  • M-x info RET (abre el navegador de información)

  • d m elisp RET (abre el manual de elisp)

  • I # RET(enumere las entradas #en el índice)

phils
fuente
25

Encontré esta pregunta mientras buscaba qué significaba el hash en algo que encontré mientras pirateaba mode-line-format:

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

que es un formato utilizado para propiedades de texto en cadenas donde:

  • "-%-", texto para ser propietario: un guión y una construcción% que resulta en "guiones suficientes para llenar el resto de la línea de modo", dando como resultado el famoso Emacs ------.
  • 0, el primer carácter sobre el que se aplican las propiedades del texto.
  • 3, el último carácter sobre el que se aplican las propiedades del texto, es decir , la totalidad "-%-".
  • (help-echo "..."), una propiedad y una cadena como argumento.

Esto se puede crear con la propertizefunción :

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

(inserte (propiedad "Desplácese sobre mí!" 'ayuda-eco' "¡Felicitaciones!"))

sería lo mismo que #("Hover over me!" 0 14 (help-echo "Congratulations!")):

Pequeño ejemplo.

Si está usando el modo de bloqueo de fuente, el uso del buffer-substringcomando puede producir algo como esto:

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

Entonces podrías crear algo como:

Mostrando la función de propiedad correspondiente para múltiples propiedades.

Iceland_jack
fuente