Я вижу острые кавычки, используемые в коде eLisp других людей, и использую их сам, но я не совсем понимаю, когда они уместны, а когда нет.
Может ли кто-нибудь уточнить, когда именно целесообразно использовать острые кавычки и когда вместо них следует использовать обычные одинарные кавычки?
#'
с лямбда- выражением (где ответ в основном «никогда»), тогда как вопрос @ izkon относится скорее к использованию#'
применительно к символам.Ответы:
#'
это просто сокращение дляfunction
, так же, как'
сокращение дляquote
.Вы можете использовать его в любом месте, где хотите указать байтовому компилятору, интерпретатору или читателю-человеку, что его аргумент, как ожидается, будет (рассматривается как) функция.
Во многих контекстах контекст определяет, как обрабатывается аргумент, если, например, вы просто заключаете его в кавычки (используйте
quote
или'
) вместо использования#'
(илиfunction
). Например, в контексте, где символ используется только для егоsymbol-function
свойства, то есть он используется как функция, вы можете просто передать символ (например, заключив его в кавычки или передав переменную, значение которой является символом).Но иногда код становится понятнее, если вы используете его
#'
в таком контексте. Даже если сам Emacs-Lisp понимает, что символ используется как функция в таких контекстах, это может помочь подчеркнуть это для читателя кода.В некоторых других Лиспах обработка лямбда-форм, которые просто заключаются в кавычки (с
'
) или не заключаются в кавычки, могут отличаться от их использования в функциональной позиции при цитировании с использованиемfunction
(#'
). Но не в Emacs Lisp. В Emacs Lisp вам не нужно заключать в кавычки (используя либо'
или#'
) лямбда-форму, которую вы хотите обрабатывать как функцию (а не просто как список). Если вы хотите, чтобы он обрабатывался как список, с автомобилемlambda
и т. Д., Укажите его (с'
) - пример, приведенный ниже, иллюстрирует это.От (elisp) анонимных функций :
источник
#'
(akafunction
) может использоваться перед,(lambda ...)
но он там избыточен, поэтому единственное место, где он действительно имеет значение, находится перед символом, как в#'car
. В ELisp#'car
и'car
почти полностью эквивалентны, поэтому одной из основных целей является просто документировать намерение (т.е. указать тому, кто читает этот код, что вы намереваетесь использовать этот символ в качестве функции). Тем не менее, есть несколько обстоятельств, где разница более значительна:#'car
он проверит,car
существует ли как функция, и если он не найдет ее, он выдаст предупреждение, так же, как если бы у вас был вызов этой функции. ,Внутри
cl-flet
иcl-labels
, только#'f
может ссылаться на локально определенную функциюf
, потому что'f
все равно будет ссылаться на глобальный символf
(и какая функция может быть сохранена в своемsymbol-function
слоте). Напримеристочник