#'
це просто скорочення 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
компілюється в байт , збирається в об'єкт функції байт-коду (* Примітка Компіляція байтів: :).
• Якщо ввімкнено лексичне зв’язування, 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
має намір використовувати його як функцію.