В чем разница между «и #» перед символом?

22

Я немного новичок в Emacs. Просматривая некоторые конфигурации, я обнаружил, что в «add-hook» есть команда двух типов.

(add-hook 'LaTeX-mode-hook #'LaTeX-math-mode)

а также

(add-hook 'LaTeX-mode-hook 'LaTeX-math-mode)

Это смущало меня долгое время, и я не знаю, как искать "#" в Google ...

Благодарю.

X.Arthur
источник
2
Извините, это моя ошибка. Нашел ответ: stackoverflow.com/questions/2701698/…
X.Arthur
См. Также emacswiki.org/emacs/EmacsSymbolNotation
xuchunyang
2
Дубликаты на других сайтах в порядке. Здесь есть один, который почти дубликат. emacs.stackexchange.com/q/3595/50
Малабарба

Ответы:

21

В Emacs Lisp, если fooявляется символом, то 'fooи #'fooполностью эквивалентны. Последняя форма (с #') предпочтительна, когда fooявляется функцией, так как она документирует тот факт, что она предназначена для того, чтобы быть вызванной.

Таким образом, ваши две формы полностью эквивалентны, и тот, который с #'предпочтительным.

Редактировать : как указал Малабарба, это не совсем так: #'символы будут заставлять байт-компилятор выдавать предупреждение, если функция не определена.

(Обратите внимание, что это не относится к лямбда-формам, для которых обычный 'метод запрещает байт-компилятору компилировать лямбда-формы, как описано в другом месте . Отметим далее, что это также не обязательно имеет место в других диалектах Лисп, например, в Common Lisp #'fooвыполняет раннее связывание.)

JCH
источник
Право на предупреждения. Что касается лямбда-выражения, #'указывает компилятору компилировать лямбда- выражение, а не простую кавычку, которая этого не делает. Я переформулировал это, надеюсь, более четко.
JCH