P: Quando, se for o caso, é útil fazer aspas a a lambda
e quando, se for o caso, não devemos citar a a lambda
?
As pessoas usam lambda
s de três maneiras:
- avião:
(lambda (x) x)
- citado:
'(lambda (x) x)
- citações nítidas:
#'(lambda (x) x)
Esse thread SO discute os três tipos, esse thread SO explica por que não citar (NB: not -sharp-quote ) lambda
s, e esse thread SO também discute as distinções entre aspas e aspas .
Agora, o nó manual em funções anônimas e a sequência de caracteres para lambda
observar que lambda
s são citados automaticamente:
Uma chamada do formulário
(lambda ARGS DOCSTRING INTERACTIVE BODY)
é citada automaticamente; o resultado da avaliação da expressão lambda é a própria expressão. A expressão lambda pode então ser tratada como uma função ...
Portanto, parece que (lambda (x) x)
e #'(lambda (x) x)
são equivalentes, mas '(lambda (x) x)
não são (o mais importante, quando a compilação de bytes).
Parece que alguém raramente gostaria de citar a lambda
, mas não está claro para mim quando, se é que deveríamos, deveríamos, ou não, citar:
- A citação nítida é
lambda
simplesmente uma escolha estilística ou há circunstâncias em que a citação nítida é realmente útil? - Existem circunstâncias em que devemos não sharp-citar um
lambda
, isto é, quando isso alteraria o significado do código?
lambda
isso foi definido como uma macro que adiciona o valor ofunction
mais antigo possível. IOW, se#'
necessário em algum momento, estava no código de desenvolvimento muito cedo. Certamente já não era necessário no Emacs-18.Como
lambda
não faz sentido quando não está entre aspas, as versões recentes do Emacs Lisp seguem o Common Lisp (ANSI) na interpretação entre aspas(lambda...)
como#'(lambda...)
. As duas notações são quase exatamente equivalentes (exceto dentro da estrutura citada).Se prefere
(lambda...)
ou#'(lambda...)
é, portanto, puramente uma questão de estilo. Algumas pessoas preferem a forma nua, o que evita ruídos sintáticos, enquanto outras (inclusive eu) preferem a forma citada.fonte
Adicionando um pouco de histórico adicional, por ter visto o legado histórico Is # '(lambda ...)?
https://debbugs.gnu.org/cgi/bugreport.cgi?bug=4290 sugere que:
Não conheço o byte-compiler, mas vejo que, pelo menos em 1993, a
lambda
própria macro retornou um(function (lambda ...))
formulário.https://www.iro.umontreal.ca/~monnier/hopl-4-emacs-lisp.pdf também diz:
fonte
Só quero dar um exemplo prático de uso da expressão lambda backtic. Trata-se de sombreamento de variável / ligação lexical, o uso de uma expressão lambda de backtic e a referência a variáveis com vírgula possibilitam obter seu valor global.
M-x [RET] eval-buffer
saídas "idade aleatória"M-x [RET] eval-buffer
saídas "aleatórias"Um terceiro exemplo que combina variável global e variável local de variável
M-x [RET] eval-buffer
saídas "Aleatório" "Aleatório antigo"fonte