Vejo citações nítidas sendo usadas no código eLisp de outras pessoas e as utilizo pessoalmente, mas não sou totalmente claro quando elas são apropriadas e quando não são.
Alguém poderia esclarecer exatamente quando é apropriado usar aspas nítidas e quando aspas simples comuns devem ser usadas?
#'
com lambda (onde a resposta é basicamente "nunca"), enquanto a pergunta do @izkon se aplica mais ao uso de#'
símbolos aplicados.Respostas:
#'
é apenas uma abreviação parafunction
, assim como'
é uma abreviação paraquote
.Você pode usá-lo em qualquer lugar onde queira indicar ao compilador de bytes ou ao intérprete ou a um leitor humano que seu argumento deve ser (é tratado como) uma função.
Em muitos contextos, o contexto determina como o argumento é tratado se, por exemplo, você simplesmente o citar (use
quote
ou'
) em vez de usar#'
(oufunction
). Por exemplo, em um contexto em que um símbolo é usado apenas para suasymbol-function
propriedade, ou seja, é usado como uma função, você pode simplesmente passar o símbolo (por exemplo, citando-o ou passando uma variável cujo valor é o símbolo).Mas, às vezes, o código é mais claro se você usar
#'
em tais contextos. Mesmo que o próprio Emacs-Lisp entenda que o símbolo é usado como uma função em tais contextos, isso pode ajudar a enfatizar isso para um leitor humano do código.Em alguns outros Lisps, o tratamento de formulários lambda que são simplesmente citados (com
'
) ou não citados pode diferir do uso em uma posição de função quando citados usandofunction
(#'
). Mas não no Emacs Lisp. No Emacs Lisp, você não precisa citar (usando um'
ou#'
) um formulário lambda que deseja tratar como uma função (e não simplesmente como uma lista). Se você deseja que ele seja tratado apenas como uma lista, com carrolambda
, etc., cite-o (com'
) - o exemplo abaixo ilustra isso.Funções anônimas do (elisp) :
fonte
#'
(akafunction
) pode ser usado na frente,(lambda ...)
mas é redundante, então o único lugar em que é realmente significativo está na frente de um símbolo, como em#'car
. No ELisp,#'car
e'car
são quase completamente equivalentes, um dos principais objetivos é simplesmente documentar a intenção (ou seja, indicar para quem lê esse código que você pretende usar esse símbolo como uma função). No entanto, existem algumas circunstâncias em que a diferença é mais significativa:#'car
, verifica secar
existe como uma função e, se não a encontrar, emitirá um aviso, como faria se você tivesse uma chamada para essa função. .Inside
cl-flet
ecl-labels
, só#'f
pode se referir à função definida localmentef
, porque'f
ainda se refere ao símbolo globalf
(e a função que estiver armazenada em seusymbol-function
slot). Por exemplofonte