Lorsque vous postez des questions et des réponses ici, les termes "fonction" et "commande" sont parfois utilisés indifféremment. Dans d'autres cas, les utilisateurs n'utilisent que l'un des deux termes pour discuter d'éléments de code spécifiques. Comme leurs articles traitent généralement d’autres sujets, ils n’expliquent pas pourquoi ils utilisent un terme mais pas l’autre. Alors:
Q: Dans Emacs Lisp, quelle est la différence entre une fonction et une commande?
C-h i
, choisissez le manuel Elisp ,i command
- vous place correctement dans le noeudWhat is a function?
, ce qui rend tout cela clair. Aidez les utilisateurs à apprendre à demander à Emacs. (Juste un avis.)Réponses:
Chaque commande est une fonction, mais chaque fonction n'est pas également une commande. 1
Une commande inclut un appel à
interactive
; C'est pourquoi les commandes sont communément appelées "fonctions interactives". Les commandes peuvent être appelées via M-xname-of-command
RET, et elles peuvent également être liées à une séquence de touches. Les fonctions standard n'incluent pas d' appel àinteractive
, ne peuvent pas être appelées à l'aide M-xet vous ne pouvez pas les lier à une séquence de touches. Pour exécuter une fonction qui n’est pas interactive, vous pouvez appuyer sur M-:(eval-expression
), saisir le nom de la fonction suivi des valeurs pour tous les arguments dont il a besoin entre parenthèses, puis appuyer sur RET:M-:
(name-of-function arg1 arg2 arg3)
RETSi la fonction n'est pas censée fonctionner sur le tampon actuel, vous pouvez également entrer
dans le
*scratch*
tampon et appuyez sur C-x C-e(eval-last-sexp
) avec le point positionné après la parenthèse fermante.Pour rendre une fonction
bar
disponible sous forme de commande, vous pouvez l'envelopper dans une fonction interactive personnalisée (foo
) comme suit:Bien sûr, si
bar
prend un ou plusieurs arguments, vous devrez les fournir afin de fairefoo
fonctionner correctement.Si vous voyez des personnes utiliser les termes "fonction" et "commande" de manière interchangeable, cela peut indiquer (en fonction du contexte) qu'elles ne sont pas conscientes des différences entre les concepts sous-jacents.
1 Notez que je parle de
defun
s ici. Comme @Stefan le fait remarquer dans les commentaires, les macros de clavier constituent un cas particulier: elles peuvent être considérées comme des commandes mais ne sont pas des fonctions.la source
interactive
"appels" sont généralement appelés déclarations (la fonction elle-même ne fait rien).M-: (commandp [?a]) RET
je vais (correctement) vous dire que[?a]
c'est une commande, mais ce n'est pas une fonction.