#'
это просто сокращение для function
, так же, как '
сокращение для quote
.
Вы можете использовать его в любом месте, где хотите указать байтовому компилятору, интерпретатору или читателю-человеку, что его аргумент, как ожидается, будет (рассматривается как) функция.
Во многих контекстах контекст определяет, как обрабатывается аргумент, если, например, вы просто заключаете его в кавычки (используйте quote
или '
) вместо использования #'
(или function
). Например, в контексте, где символ используется только для его symbol-function
свойства, то есть он используется как функция, вы можете просто передать символ (например, заключив его в кавычки или передав переменную, значение которой является символом).
Но иногда код становится понятнее, если вы используете его #'
в таком контексте. Даже если сам Emacs-Lisp понимает, что символ используется как функция в таких контекстах, это может помочь подчеркнуть это для читателя кода.
В некоторых других Лиспах обработка лямбда-форм, которые просто заключаются в кавычки (с '
) или не заключаются в кавычки, могут отличаться от их использования в функциональной позиции при цитировании с использованием function
( #'
). Но не в Emacs Lisp. В Emacs Lisp вам не нужно заключать в кавычки (используя либо '
или #'
) лямбда-форму, которую вы хотите обрабатывать как функцию (а не просто как список). Если вы хотите, чтобы он обрабатывался как список, с автомобилем lambda
и т. Д., Укажите его (с '
) - пример, приведенный ниже, иллюстрирует это.
От (elisp) анонимных функций :
- Специальная форма: function
function-object
Эта специальная форма возвращается FUNCTION-OBJECT
без оценки.
В этом он похож на quote
(* примечание цитирования: :). Но в отличие от этого
quote
, он также служит примечанием для оценщика Emacs и байтового компилятора, который FUNCTION-OBJECT
предназначен для использования в качестве функции. Предполагая, что FUNCTION-OBJECT
является допустимым лямбда-выражением, это имеет два эффекта:
• Когда код компилируется байтом, FUNCTION-OBJECT
компилируется в объект функции байтового кода (* note By By Compilation: :).
• Когда лексическое связывание включено, FUNCTION-OBJECT
преобразуется в замыкание. * Примечание Закрытия ::.
Синтаксис чтения #'
является сокращением для использования function
. Следующие формы все эквивалентны:
(lambda (x) (* x x))
(function (lambda (x) (* x x)))
#'(lambda (x) (* x x))
В следующем примере мы определяем change-property
функцию, которая принимает функцию в качестве третьего аргумента, а затем double-property
функцию, которая использует ее change-property
, передавая ей анонимную функцию:
(defun change-property (symbol prop function)
(let ((value (get symbol prop)))
(put symbol prop (funcall function value))))
(defun double-property (symbol prop)
(change-property symbol prop (lambda (x) (* 2 x))))
Обратите внимание, что мы не цитируем lambda
форму.
Если вы скомпилируете приведенный выше код, анонимная функция также скомпилируется. Этого бы не произошло, если бы, скажем, вы создали анонимную функцию, заключив ее в список:
(defun double-property (symbol prop)
(change-property symbol prop '(lambda (x) (* 2 x))))
В этом случае анонимная функция сохраняется как лямбда-выражение в скомпилированном коде. Байт-компилятор не может предположить, что этот список является функцией, даже если он выглядит как единица, поскольку он не знает, что
change-property
намеревается использовать его как функцию.