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?
C-h i
, elija el manual de Elisp , loi command
coloca directamente en el nodoWhat is a function?
, lo que aclara todo esto. Ayuda a los usuarios a aprender a preguntar a Emacs. (Solo una opinión.)Respuestas:
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-xname-of-command
RET, y también se pueden vincular a una secuencia de teclas. Las funciones regulares no incluyen una llamada ainteractive
, 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)
RETSi no se supone que la función opere en el búfer actual, también puede ingresar
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
bar
esté disponible como comando, puede envolverla en una función interactiva personalizada (foo
) de la siguiente manera:Por supuesto, si
bar
toma uno o más argumentos, deberá proporcionarlos para quefoo
funcione 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
defun
s aquí. Como @Stefan señala en los comentarios, las macros de teclado son un caso especial: pueden considerarse comandos , pero no son funciones.fuente
interactive
"llamadas" generalmente se llaman declaraciones (la función en sí misma no hace nada).M-: (commandp [?a]) RET
, (correctamente) le dirá que[?a]
es un comando, pero no es una función.