Q: Когда, если вообще, полезно ли ставить острые кавычки lambda
, и когда, если вообще, мы не должны резкие кавычки lambda
?
Люди используют lambda
s тремя способами:
- равнина:
(lambda (x) x)
- цитировал:
'(lambda (x) x)
- резкое цитируемое:
#'(lambda (x) x)
Этот поток SO обсуждает три типа, этот поток SO объясняет, почему не заключать в кавычки (примечание: не резкие кавычки ) lambda
, и этот поток SO также обсуждает различия между цитированием и точными кавычками.
Теперь ручной узел по анонимным функциям и строка документации для lambda
примечания, что lambda
s являются самоквитируемыми:
Звонок формы
(lambda ARGS DOCSTRING INTERACTIVE BODY)
- это само цитирование; Результатом вычисления лямбда-выражения является само выражение. Лямбда-выражение затем может рассматриваться как функция ...
Итак, кажется, что (lambda (x) x)
и #'(lambda (x) x)
эквивалентны, но '(lambda (x) x)
это не так (главное, при байтовой компиляции).
Похоже , что один редко хотите процитироватьlambda
, но непонятно мне , когда, если когда - либо, мы должны или не должны, с острыми цитирую:
- Острые цитаты - это
lambda
просто стилистический выбор, или есть обстоятельства, при которых резкие цитаты действительно полезны? - Существуют ли обстоятельства, при которых мы не должны ставить точные кавычки
lambda
, то есть когда это меняет смысл кода?
lambda
она была определена как макрос, который добавляет значение «function
как можно раньше». IOW, если#'
в какой-то момент это было необходимо, это было в самом раннем коде разработки. Это точно не было нужно уже в Emacs-18.Так как
lambda
не имеет никакого смысла , когда он не цитирует, последние версии Emacs Lisp следует (ANSI) Common Lisp в интерпретации некотируемых ,(lambda...)
как#'(lambda...)
. Эти два обозначения почти в точности эквивалентны (кроме как в цитируемой структуре).Предпочитать
(lambda...)
или#'(lambda...)
, следовательно, чисто вопрос стиля. Некоторые люди предпочитают голую форму, которая избегает синтаксического шума, в то время как другие (включая меня) предпочитают цитируемую форму.источник
Добавим немного дополнительной истории, потому что увидим # '(лямбда ...) историческое наследие?
https://debbugs.gnu.org/cgi/bugreport.cgi?bug=4290 предполагает, что:
Я не знаю о байт-компиляторе, но я вижу, что, по крайней мере, еще в 1993 году сам
lambda
макрос возвратил(function (lambda ...))
форму.https://www.iro.umontreal.ca/~monnier/hopl-4-emacs-lisp.pdf также говорит:
источник
Просто хочу привести практический пример использования лямбда-выражения backtic. Речь идет о лексическом связывании / теневом копировании переменных, использование лямбда-выражения backtic и обращение к переменным через запятую позволяет получить их глобальное значение.
M-x [RET] eval-buffer
выходы "Случайный старый"M-x [RET] eval-buffer
выходы "Random"Третий пример объединения глобальной переменной и локальной переменной
M-x [RET] eval-buffer
выводит "Random", "Random old"источник