Veo que se usan comillas nítidas en el código eLisp de otras personas, y las uso yo mismo, pero no tengo completamente claro cuándo son apropiadas y cuándo no.
¿Podría alguien aclarar exactamente cuándo es apropiado usar comillas definidas y cuándo se deben usar comillas simples ordinarias?
#'
con lambda (donde la respuesta es básicamente "nunca"), mientras que la pregunta de @ izkon se aplica más bien al uso de#'
símbolos aplicados.Respuestas:
#'
se acaba de taquigrafía parafunction
, al igual que'
es la abreviatura dequote
.Puede usarlo en cualquier lugar donde desee indicar al compilador de bytes o al intérprete o un lector humano que se espera que su argumento sea (se trata como) una función.
En muchos contextos, el contexto determina cómo se trata el argumento si, por ejemplo, simplemente lo cita (use
quote
o'
) en lugar de usar#'
(ofunction
). Por ejemplo, en un contexto en el que un símbolo se usa solo para susymbol-function
propiedad, es decir, se usa como una función, puede pasar el símbolo (por ejemplo, al citarlo o al pasar una variable cuyo valor es el símbolo).Pero a veces el código es más claro si lo usa
#'
en tales contextos. Incluso si Emacs-Lisp mismo entiende que el símbolo se usa como una función en tales contextos, podría ayudar enfatizar esto para un lector humano del código.En algunos otros Lisps, el tratamiento de formas lambda que simplemente se citan (con
'
) o no se pueden citar de su uso en una posición de función cuando se citan usandofunction
(#'
). Pero no en Emacs Lisp. En Emacs Lisp no necesita citar (usando uno'
o más#'
) un formulario lambda que desee que se trate como una función (y no simplemente como una lista). Si desea que se maneje solo como una lista, con automóvillambda
, etc., cítelo (con'
); el siguiente ejemplo ilustra esto.De (elisp) Funciones anónimas :
fuente
#'
(akafunction
) se puede usar delante de,(lambda ...)
pero es redundante allí, por lo que el único lugar donde es realmente significativo es delante de un símbolo, como en#'car
. En ELisp,#'car
y'car
son casi completamente equivalentes, entonces uno de los propósitos principales es simplemente documentar la intención (es decir, indicar a quien lea este código que tiene la intención de usar este símbolo como una función). Sin embargo, hay algunas circunstancias en las que la diferencia es más significativa:#'car
verificará sicar
existe como función, y si no la encuentra, emitirá una advertencia, tal como lo haría si tuviera una llamada a esa función .Dentro
cl-flet
ycl-labels
solo#'f
puede referirse a la función definida localmentef
, ya'f
que todavía se referirá al símbolo globalf
(y a cualquier función que pueda estar almacenada en susymbol-function
ranura). P.ejfuente