Quelle est la différence entre une fonction et une commande?

35

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?

itsjeyd
la source
13
Vous avez parfaitement le droit de le faire, bien sûr, et je suis sûr que certaines personnes en bénéficieront. Mais FWIW, je ne suis pas en faveur de questions-réponses ici pour chaque petite chose qu'il pourrait être préférable d'apprendre à quelqu'un d' interroger Emacs lui-même . C’est un exemple, OMI - il n’est pas difficile de le savoir et Emacs donne une bonne réponse. C-h i, choisissez le manuel Elisp , i command- vous place correctement dans le noeud What is a function?, ce qui rend tout cela clair. Aidez les utilisateurs à apprendre à demander à Emacs. (Juste un avis.)
Drew
1
Cela dit, vous avez bien posé et répondu à la question.
Drew
5
@Drew, je suis tout à fait d'accord pour apprendre aux gens à demander d'abord à Emacs. L'objectif principal de ce spécifique Q & A est de rendre plus facile de promouvoir l' utilisation correcte des termes et de sensibiliser les utilisateurs des différences entre les commandes et les fonctions si nécessaire: Parfois, les gens sont pas au courant que cela est une question qu'ils devraient se poser , et il est plus facile de désigner une ressource générique vers laquelle les diriger, que de répéter sans cesse le même contenu dans les commentaires.
Itsjeyd
1
Ceci dit, merci de nous avoir indiqué comment trouver des informations pertinentes dans Emacs :)
jeudi
1
Nous sommes d'accord: il s'agit d'aider les utilisateurs à utiliser Emacs. Ce site est un moyen d'y parvenir.
Drew

Réponses:

44

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-x name-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) RET

Si la fonction n'est pas censée fonctionner sur le tampon actuel, vous pouvez également entrer

(name-of-function arg1 arg2 arg3)

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 bardisponible sous forme de commande, vous pouvez l'envelopper dans une fonction interactive personnalisée ( foo) comme suit:

(defun foo ()
  (interactive)
  (bar))

Bien sûr, si barprend un ou plusieurs arguments, vous devrez les fournir afin de faire foofonctionner 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 defuns 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.

itsjeyd
la source
5
Nippick mineur: les interactive"appels" sont généralement appelés déclarations (la fonction elle-même ne fait rien).
Shosti
5
@itsjeyd: En fait, non, il y a aussi des commandes qui ne sont pas des fonctions. C'est le cas des macros de clavier . Par exemple, M-: (commandp [?a]) RETje vais (correctement) vous dire que [?a]c'est une commande, mais ce n'est pas une fonction.
Stefan
@Stefan Merci de l'avoir signalé. J'ai mis à jour ma réponse.
Itsjeyd