emacs / elisp: Для чего используется символ решетки (фунт, знак числа, октотохрп)?


102

Что это значит?

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

... и чем он отличается от

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

Ответы:


100

Нет никакой разницы:

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

дает t

#Может быть использовано в передней части lambdaвыражения , указывающее на байты-компилятор , что следующее выражение может быть составлены байтами, см документации для анонимных функций . Но в случае с символом компилировать нечего.

Как правило, он используется в печатном изображении вместе с левой угловой скобкой (<), чтобы указать, что напечатанный объект является описанием (но не может быть прочитан). Например:

#<buffer foo.txt>

Он также используется читателем в конструкциях для представления круговых структур. См. Документацию по синтаксису чтения для круглых объектов .

И тогда у вас есть его использование для обозначения базы для целых чисел , например #x2c -> 44.

Плюс еще я уверен.


12
Согласно этой статье , одна из веских причин для применения #к одиночному символу - получить диагностику во время компиляции, если этот символ не определен.
ajk

3
Не совсем верно, что «в случае символа нечего компилировать». Компилятор байтов интерпретирует # 'car как означающий «Я всегда имею в виду функцию` foo', а не символ foo ». Затем он может фактически встроить определение foo в байт-скомпилированный вывод. (Правка: нет, это действительно неправильно. Символ # не будет компилироваться по байтам иначе, чем символ - это просто маркер намерения.)
Джонатан Томер

11
Возможно, еще упомянем, что 'symbolпредставляет (quote symbol)и #'symbolпредставляет (function symbol)синтаксически.
tripleee

27

Список, который должен быть исчерпывающим, можно найти в верхней части справочного указателя Emacs lisp .

Изменить : Или, что еще удобнее, из самого Emacs:

  • M-x info RET (откройте информационный браузер)

  • d m elisp RET (открыть руководство по elisp)

  • I # RET(перечислите записи #в указателе)


25

Я нашел этот вопрос, когда искал, что означает хеш в том, что нашел во время взлома mode-line-format:

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

формат, используемый для свойств текста в строках, где:

  • "-%-", текст, который нужно присвоить: одно тире и % -конструкция, которая дает «тире, достаточные для заполнения оставшейся части строки режима», в результате получается знаменитый Emacs ------.
  • 0, первый символ, к которому применяются свойства текста.
  • 3, последний символ, к которому применяются свойства текста, т. е. весь "-%-".
  • (help-echo "..."), свойство и строка в качестве аргумента.

Это можно создать с помощью propertizeфункции :

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

(вставить (свойство «Наведите на меня!» 'help-echo' «Поздравляем!»))

будет таким же, как #("Hover over me!" 0 14 (help-echo "Congratulations!")):

Небольшой пример.

Если вы используете режим блокировки шрифта, при использовании buffer-substringкоманды может получиться что-то вроде этого:

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

Итак, вы можете создать что-то вроде:

Отображение соответствующей функции свойств для нескольких свойств.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.