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?
C-h i
, wählen Sie das Elisp-Handbuch ,i command
- bringt Sie direkt in den KnotenWhat is a function?
, was all dies kristallklar macht. Helfen Sie Benutzern, Emacs zu fragen. (Nur eine Meinung.)Antworten:
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-xname-of-command
RETund an eine Tastenfolge gebunden werden. Normale Funktionen enthalten keinen Aufruf voninteractive
, 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)
RETWenn die Funktion nicht mit dem aktuellen Puffer arbeiten soll, können Sie auch eingeben
*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
bar
als Befehl verfügbar zu machen , können Sie siefoo
wie folgt in eine benutzerdefinierte interaktive Funktion ( ) einbinden:Wenn Sie
bar
ein oder mehrere Argumente verwenden, müssen Sie diese natürlich angeben, damitfoo
die 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
defun
s spreche . Wie @Stefan in den Kommentaren ausführt, sind Tastaturmakros ein Sonderfall: Sie können als Befehle betrachtet werden , sind aber keine Funktionen.quelle
interactive
"Calls" heißen normalerweise Deklarationen (die Funktion selbst macht eigentlich nichts).M-: (commandp [?a]) RET
wird (korrekterweise) angezeigt, dass[?a]
es sich um einen Befehl handelt, der jedoch keine Funktion ist.