Qual è la differenza tra una funzione e un comando?


35

Quando si pubblicano domande e risposte qui, le persone a volte usano i termini "funzione" e "comando" in modo intercambiabile. In altri casi, le persone usano solo uno dei due termini per discutere specifiche parti di codice. Poiché i loro post di solito si concentrano su altri argomenti, non spiegano perché usano un termine ma non l'altro. Così:

D: In Emacs Lisp, qual è la differenza tra una funzione e un comando?


13
Hai tutto il diritto di farlo, ovviamente, e sono sicuro che alcune persone saranno aiutate da questo. Ma FWIW non sono a favore di domande e risposte qui per ogni piccola cosa che potrebbe essere meglio insegnare a qualcuno a chiedere a Emacs stesso . Questo è uno di questi, IMO: non è difficile scoprirlo ed Emacs dà una buona risposta. C-h i, scegli il manuale di Elisp , i command- ti mette nel nodo What is a function?, il che rende tutto questo cristallino. Aiuta gli utenti a imparare a chiedere a Emacs. (Solo un'opinione.)
Tratto il

1
Detto questo, hai posto e risposto bene alla domanda.
Disegnò il

5
@Drew Sono d'accordo al 100% sull'insegnamento alle persone di chiedere prima a Emacs. Lo scopo principale di queste domande e risposte specifiche è di facilitare la promozione dell'uso corretto dei termini e di rendere gli utenti consapevoli delle differenze tra comandi e funzioni, se necessario: a volte le persone non sono consapevoli del fatto che questa è una domanda che dovrebbero porre , e avere una risorsa generica a cui indirizzarli è più facile che ripetere lo stesso contenuto ripetutamente nei commenti.
È il

1
Detto questo, grazie per aver menzionato come trovare informazioni pertinenti all'interno di Emacs :)
itsjeyd

1
Siamo d'accordo: si tratta di aiutare gli utenti a utilizzare Emacs. Questo sito è un mezzo a tal fine.
Tratto il

Risposte:


44

Ogni comando è una funzione, ma non tutte le funzioni sono anche un comando. 1

Un comando include una chiamata a interactive; ecco perché i comandi sono comunemente chiamati "funzioni interattive". I comandi possono essere invocati tramite M-x name-of-command RETe possono anche essere associati a una sequenza di tasti. Le funzioni regolari non includono una chiamata a interactive, non possono essere chiamate utilizzando M-xe non è possibile associarle a una sequenza di tasti. Per eseguire una funzione non interattiva, è possibile premere M-:( eval-expression), immettere il nome della funzione seguito dai valori per tutti gli argomenti che devono essere racchiusi tra parentesi e premere RET:

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

Se la funzione non deve funzionare sul buffer corrente, è anche possibile inserire

(name-of-function arg1 arg2 arg3)

nel *scratch*buffer e premere C-x C-e( eval-last-sexp) con il punto posizionato dopo la parentesi di chiusura.

Per rendere bardisponibile una funzione come comando, puoi inserirla in una funzione interattiva personalizzata ( foo) come segue:

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

Naturalmente, se baraccetta uno o più argomenti, dovrai fornirli per far foofunzionare correttamente.

Se vedi persone che usano i termini "funzione" e "comando" in modo intercambiabile, ciò potrebbe indicare (a seconda del contesto) che non sono a conoscenza delle differenze tra i concetti sottostanti.


1 Nota che sto parlando di defuns qui. Come sottolinea @Stefan nei commenti, le macro della tastiera sono un caso speciale: possono essere considerate comandi , ma non sono funzioni.


5
Minore nitpick: le interactive"chiamate" sono generalmente chiamate dichiarazioni (la funzione stessa non fa nulla).
shosti,

5
@itsjeyd: In realtà no, ci sono anche comandi che non sono funzioni. Questo è il caso delle macro da tastiera . Ad esempio M-: (commandp [?a]) RET(correttivamente) ti dirà che [?a]è un comando, ma non è una funzione.
Stefan,

@Stefan Grazie per averlo sottolineato. Ho aggiornato la mia risposta.
itsjeyd
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.