¿Cuál es la diferencia entre una función y un comando?

35

Al publicar preguntas y respuestas aquí, las personas a veces usan los términos "función" y "comando" indistintamente. En otros casos, las personas solo usan uno de los dos términos para discutir partes específicas del código. Como sus publicaciones generalmente se centran en otros temas, no explican por qué están usando un término pero no el otro. Asi que:

P: En Emacs Lisp, ¿cuál es la diferencia entre una función y un comando?

itsjeyd
fuente
13
Tiene todo el derecho de hacerlo, por supuesto, y estoy seguro de que algunas personas serán ayudadas por esto. Pero FWIW no estoy a favor de las preguntas y respuestas aquí por cada pequeña cosa sobre la que sería mejor enseñarle a alguien a preguntarle a Emacs . Este es uno de estos, IMO: no es difícil descubrirlo, y Emacs da una buena respuesta. C-h i, elija el manual de Elisp , lo i commandcoloca directamente en el nodo What is a function?, lo que aclara todo esto. Ayuda a los usuarios a aprender a preguntar a Emacs. (Solo una opinión.)
Dibujó
1
Dicho esto, planteaste y respondiste bien a la pregunta.
Dibujó
55
@Drew Estoy de acuerdo al 100% en enseñarle a la gente a preguntarle a Emacs primero. El objetivo principal de estas preguntas y respuestas específicas es facilitar la promoción del uso correcto de los términos y hacer que los usuarios sean conscientes de las diferencias entre comandos y funciones si es necesario: a veces, las personas no son conscientes de que esta es una pregunta que deberían hacer , y tener un recurso genérico para señalarlos es más fácil que repetir el mismo contenido una y otra vez en los comentarios.
itsjeyd
1
Dicho esto, gracias por mencionar cómo encontrar información relevante dentro de Emacs :)
itsjeyd
1
Estamos de acuerdo: se trata de ayudar a los usuarios a usar Emacs. Este sitio es un medio para ese fin.
Dibujó

Respuestas:

44

Cada comando es una función, pero no todas las funciones son también un comando. 1

Un comando incluye una llamada a interactive; Es por eso que los comandos se conocen comúnmente como "funciones interactivas". Los comandos se pueden invocar mediante M-x name-of-command RET, y también se pueden vincular a una secuencia de teclas. Las funciones regulares no incluyen una llamada a interactive, no se puede llamar usando M-x, y no puede vincularlas a una secuencia de teclas. Para ejecutar una función que no es interactiva, puede presionar M-:( eval-expression), ingresar el nombre de la función seguido de valores para cualquier argumento que necesite encerrado entre paréntesis y presionar RET:

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

Si no se supone que la función opere en el búfer actual, también puede ingresar

(name-of-function arg1 arg2 arg3)

en el *scratch*búfer y presione C-x C-e( eval-last-sexp) con el punto posicionado después del paréntesis de cierre.

Para que una función baresté disponible como comando, puede envolverla en una función interactiva personalizada ( foo) de la siguiente manera:

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

Por supuesto, si bartoma uno o más argumentos, deberá proporcionarlos para que foofuncione correctamente.

Si ve personas que usan los términos "función" y "comando" indistintamente, esto podría indicar (según el contexto) que no son conscientes de las diferencias entre los conceptos subyacentes.


1 Tenga en cuenta que estoy hablando de defuns aquí. Como @Stefan señala en los comentarios, las macros de teclado son un caso especial: pueden considerarse comandos , pero no son funciones.

itsjeyd
fuente
55
Nitpick menor: las interactive"llamadas" generalmente se llaman declaraciones (la función en sí misma no hace nada).
shosti
55
@itsjeyd: En realidad, no, también hay comandos que no son funciones. Este es el caso de las macros de teclado . Por ejemplo M-: (commandp [?a]) RET, (correctamente) le dirá que [?a]es un comando, pero no es una función.
Stefan
@ Stefan Gracias por señalar eso. Actualicé mi respuesta.
itsjeyd