Qual é a diferença entre uma função e um comando?

35

Ao postar perguntas e respostas aqui, as pessoas às vezes usam os termos "função" e "comando" de forma intercambiável. Em outros casos, as pessoas usam apenas um dos dois termos para discutir partes específicas do código. Como suas postagens geralmente se concentram em outros tópicos, eles não explicam por que estão usando um termo, mas não o outro. Tão:

P: No Emacs Lisp, qual é a diferença entre uma função e um comando?

itsjeyd
fonte
13
Você tem todo o direito de fazê-lo, é claro, e tenho certeza que algumas pessoas serão ajudadas por isso. Mas, FWIW, não sou a favor das perguntas e respostas aqui para cada pequena coisa que possa ser melhor ensinar alguém a perguntar ao Emacs . Esse é um deles, IMO - não é difícil descobrir isso, e o Emacs dá uma boa resposta. C-h i, escolha o manual Elisp , i command- coloca você no nó What is a function?, o que torna tudo isso claro. Ajude os usuários a aprender a perguntar ao Emacs. (Apenas uma opinião).
Drew
11
Dito isto, você colocou e respondeu bem à pergunta.
Tirou
5
@ Drew Eu concordo 100% em ensinar as pessoas a pedirem ao Emacs primeiro. O principal objetivo dessas perguntas e respostas específicas é facilitar o uso correto dos termos e conscientizar os usuários sobre as diferenças entre comandos e funções, se necessário: às vezes, as pessoas não sabem que essa é uma pergunta que devem ser feitas , e ter um recurso genérico para apontá-los é mais fácil do que repetir o mesmo conteúdo repetidamente nos comentários.
itsjeyd
11
Dito isto, obrigado por mencionar como encontrar dentro informações relevantes de Emacs :)
itsjeyd
11
Nós concordamos - é sobre ajudar os usuários a usar o Emacs. Este site é um meio para esse fim.
Tirou

Respostas:

44

Todo comando é uma função, mas nem toda função também é um comando. 1 1

Um comando inclui uma chamada para interactive; é por isso que os comandos são comumente referidos como "funções interativas". Os comandos podem ser chamados via M-x name-of-command RETe também podem ser associados a uma sequência de teclas. As funções regulares não incluem uma chamada para interactive, não podem ser chamadas usando M-xe você não pode vinculá-las a uma sequência de teclas. Para executar uma função que não é interativa, pressione M-:( eval-expression), digite o nome da função seguido por valores para qualquer argumento que ele precise entre parênteses e pressione RET:

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

Se a função não deve operar no buffer atual, você também pode inserir

(name-of-function arg1 arg2 arg3)

no *scratch*buffer e pressione C-x C-e( eval-last-sexp) com o ponto posicionado após o parêntese de fechamento.

Para disponibilizar uma função barcomo comando, você pode agrupá-la em uma função interativa personalizada ( foo) da seguinte maneira:

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

Obviamente, se houver barum ou mais argumentos, você precisará fornecê-los para que o footrabalho funcione corretamente.

Se você vir pessoas usando os termos "função" e "comando" de forma intercambiável, isso pode indicar (dependendo do contexto) que eles não estão cientes das diferenças entre os conceitos subjacentes.


1 Observe que estou falando de defuns aqui. Como o @Stefan aponta nos comentários, as macros do teclado são um caso especial: elas podem ser consideradas comandos , mas não são funções.

itsjeyd
fonte
5
Nitpick menor: interactive"chamadas" são geralmente chamadas de declarações (a função em si não faz nada).
Shosti
5
@itsjeyd: Na verdade, não, também existem comandos que não são funções. É o caso das macros do teclado . Por exemplo M-: (commandp [?a]) RET, (correclty) dirá que [?a]é um comando, mas não é uma função.
Stefan
@ Stefan Obrigado por apontar isso. Eu atualizei minha resposta.
itsjeyd