Je vois des guillemets nets utilisés dans le code eLisp d'autres personnes, et je les utilise moi-même, mais je ne sais pas exactement quand ils sont appropriés et quand ils ne le sont pas.
Quelqu'un pourrait-il préciser exactement quand il convient d'utiliser des guillemets nets et quand les guillemets simples ordinaires devraient être utilisés à la place?
#'
avec lambda (où la réponse est fondamentalement "jamais"), tandis que la question de @ izkon s'applique plutôt à l'utilisation d'#'
appliqué aux symboles.Réponses:
#'
est juste un raccourci pourfunction
, tout comme un'
raccourci pourquote
.Vous pouvez l'utiliser partout où vous voulez indiquer au compilateur d'octets ou à l'interpréteur ou à un lecteur humain que son argument devrait être (est traité comme) une fonction.
Dans de nombreux contextes, le contexte détermine la façon dont l'argument est traité si, par exemple, vous le citez simplement (utilisez
quote
ou'
) au lieu d'utiliser#'
(oufunction
). Par exemple, dans un contexte où un symbole n'est utilisé que pour sasymbol-function
propriété, c'est-à-dire qu'il est utilisé en tant que fonction, vous pouvez simplement passer le symbole (par exemple en le citant ou en passant une variable dont la valeur est le symbole).Mais parfois, le code est plus clair si vous l'utilisez
#'
dans de tels contextes. Même si Emacs-Lisp comprend lui-même que le symbole est utilisé en tant que fonction dans de tels contextes, cela pourrait aider à le souligner pour un lecteur humain du code.Dans certains autres Lisps, le traitement des formes lambda simplement citées (avec
'
) ou non citées peut différer de leur utilisation dans une position de fonction lorsqu'elles sont citées avecfunction
(#'
). Mais pas dans Emacs Lisp. Dans Emacs Lisp, vous n'avez pas besoin de citer (en utilisant l'un'
ou l' autre#'
) un formulaire lambda que vous souhaitez traiter comme une fonction (et pas simplement comme une liste). Si vous voulez qu'il soit traité comme une simple liste, avec une voiture,lambda
etc., citez-le (avec'
) - l'exemple ci-dessous illustre cela.De (elisp) Fonctions anonymes :
la source
#'
(akafunction
) peut être utilisé devant(lambda ...)
mais il est redondant là-bas, donc le seul endroit où il est vraiment significatif est devant un symbole, comme dans#'car
. Dans ELisp,#'car
et'car
sont presque complètement équivalents, l'un des principaux objectifs est simplement de documenter l'intention (c'est-à-dire d'indiquer à celui qui lit ce code que vous avez l'intention d'utiliser ce symbole comme fonction). Pourtant, il existe quelques circonstances, où la différence est plus importante:#'car
il vérifie s'ilcar
existe en tant que fonction, et s'il ne le trouve pas, il émet un avertissement, tout comme si vous aviez appelé cette fonction. .À l'intérieur
cl-flet
etcl-labels
, seul#'f
peut faire référence à la fonction définie localementf
, car'f
fera toujours référence au symbole globalf
(et quelle que soit la fonction qui peut être stockée dans sonsymbol-function
emplacement). Par exemplela source