Was ist der Unterschied zwischen einer Funktion und einem Befehl?

35

Beim Posten von Fragen und Antworten werden die Begriffe "Funktion" und "Befehl" manchmal synonym verwendet. In anderen Fällen verwenden die Benutzer nur einen der beiden Begriffe, um bestimmte Codeteile zu besprechen. Da sich ihre Beiträge normalerweise auf andere Themen konzentrieren, erklären sie nicht, warum sie einen Begriff verwenden, aber nicht den anderen. So:

F: Worin besteht der Unterschied zwischen einer Funktion und einem Befehl in Emacs Lisp?

itsjeyd
quelle
13
Sie haben natürlich jedes Recht dazu, und ich bin sicher, dass dies einigen Menschen helfen wird. Aber FWIW, ich bin nicht für Fragen und Antworten, wenn es darum geht, jemandem beizubringen, sich selbst nach Emacs zu fragen . Dies ist eine solche, IMO - es ist nicht schwer, dies herauszufinden, und Emacs gibt eine gute Antwort. C-h i, wählen Sie das Elisp-Handbuch , i command- bringt Sie direkt in den Knoten What is a function?, was all dies kristallklar macht. Helfen Sie Benutzern, Emacs zu fragen. (Nur eine Meinung.)
Drew
1
Das heißt, Sie haben die Frage gut gestellt und beantwortet.
Drew
5
@Drew Ich stimme zu 100% zu, wenn es darum geht, Menschen zu lehren, zuerst Emacs zu fragen. Der Hauptzweck dieser speziellen Fragen und Antworten besteht darin, die korrekte Verwendung der Begriffe zu fördern und die Benutzer bei Bedarf auf die Unterschiede zwischen Befehlen und Funktionen aufmerksam zu machen: Manchmal ist den Benutzern nicht bewusst, dass dies eine Frage ist, die sie stellen sollten . und es ist einfacher, eine allgemeine Ressource zu haben, auf die sie verweisen können, als denselben Inhalt in den Kommentaren immer wieder zu wiederholen.
Es ist der
1
Vielen
1
Wir sind uns einig - es geht darum, Benutzern bei der Verwendung von Emacs zu helfen. Diese Seite ist ein Mittel zu diesem Zweck.
Drew

Antworten:

44

Jeder Befehl ist eine Funktion, aber nicht jede Funktion ist auch ein Befehl. 1

Ein Befehl beinhaltet einen Aufruf von interactive; Aus diesem Grund werden Befehle üblicherweise als "interaktive Funktionen" bezeichnet. Befehle können über aufgerufen M-x name-of-command RETund an eine Tastenfolge gebunden werden. Normale Funktionen enthalten keinen Aufruf von interactive, können nicht mit aufgerufen werden M-xund Sie können sie nicht an eine Tastenfolge binden. Um eine Funktion auszuführen, die nicht interaktiv ist, können Sie M-:( eval-expression) drücken , den Namen der Funktion gefolgt von Werten für Argumente in Klammern eingeben und Folgendes drücken RET:

M-: (name-of-function arg1 arg2 arg3) RET

Wenn die Funktion nicht mit dem aktuellen Puffer arbeiten soll, können Sie auch eingeben

(name-of-function arg1 arg2 arg3)

*scratch*Klicken Sie in den Puffer und drücken Sie C-x C-e( eval-last-sexp) mit dem Punkt nach der schließenden Klammer.

Um eine Funktion barals Befehl verfügbar zu machen , können Sie sie foowie folgt in eine benutzerdefinierte interaktive Funktion ( ) einbinden:

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

Wenn Sie barein oder mehrere Argumente verwenden, müssen Sie diese natürlich angeben, damit foodie Funktion ordnungsgemäß ausgeführt wird.

Wenn Sie austauschbar Menschen mit Hilfe der Begriffe „Funktion“ und „Befehl“ zu sehen, dies könnte angeben (je nach Kontext) , dass sie nicht über die Unterschiede zwischen den zugrundeliegenden Konzepte sind.


1 Beachten Sie, dass ich hier über defuns spreche . Wie @Stefan in den Kommentaren ausführt, sind Tastaturmakros ein Sonderfall: Sie können als Befehle betrachtet werden , sind aber keine Funktionen.

itsjeyd
quelle
5
Kleiner Nitpick: interactive"Calls" heißen normalerweise Deklarationen (die Funktion selbst macht eigentlich nichts).
Shosti
5
@itsjeyd: Eigentlich gibt es auch Befehle, die keine Funktionen sind. Dies ist bei Tastaturmakros der Fall . ZB M-: (commandp [?a]) RETwird (korrekterweise) angezeigt, dass [?a]es sich um einen Befehl handelt, der jedoch keine Funktion ist.
Stefan
@ Stefan Danke für den Hinweis. Ich habe meine Antwort aktualisiert.
Itsjeyd