Размещая вопросы и ответы здесь, люди иногда используют термины «функция» и «команда» взаимозаменяемо. В других случаях люди используют только один из двух терминов для обсуждения определенных фрагментов кода. Поскольку их сообщения обычно посвящены другим темам, они не объясняют, почему они используют один термин, а не другой. Так:
Q: В Emacs Lisp, в чем разница между функцией и командой?
C-h i
, выберите руководство Elisp ,i command
- помещает вас прямо в узелWhat is a function?
, который делает все это кристально чистым. Помогите пользователям научиться спрашивать Emacs. (Только одно мнение.)Ответы:
Каждая команда является функцией, но не каждая функция также является командой. 1
Команда включает в себя вызов
interactive
; Вот почему команды обычно называют «интерактивными функциями». Команды могут быть вызваны через M-xname-of-command
RET, и они также могут быть связаны с последовательностью клавиш. Обычные функции не включают вызовinteractive
, не могут быть вызваны с помощью M-x, и вы не можете связать их с последовательностью клавиш. Чтобы запустить функцию, которая не является интерактивной, вы можете нажать M-:(eval-expression
), ввести имя функции, а затем значения для всех необходимых аргументов, заключенные в скобки, и нажать RET:M-:
(name-of-function arg1 arg2 arg3)
RETЕсли функция не должна работать с текущим буфером, вы также можете ввести
в
*scratch*
буфере и нажмите C-x C-e(eval-last-sexp
) с точкой, расположенной после закрывающей скобки.Чтобы сделать функцию
bar
доступной как команду, вы можете обернуть ее в пользовательскую интерактивную функцию (foo
) следующим образом:Конечно, если
bar
принимает один или несколько аргументов, вам нужно будет предоставить их дляfoo
правильной работы.Если вы видите, что люди используют термины «функция» и «команда» взаимозаменяемо, это может указывать (в зависимости от контекста), что они не знают о различиях между основными понятиями.
1 Обратите внимание, что я говорю о
defun
с здесь. Как отмечает @Stefan в комментариях, клавиатурные макросы являются особым случаем: их можно рассматривать как команды , но они не являются функциями.источник
interactive
«вызовы» обычно называются объявлениями (сама функция на самом деле ничего не делает).M-: (commandp [?a]) RET
, (correclty) скажет вам, что[?a]
это команда, но это не функция.