Чим відрізняється функція від команди?


35

Опублікувавши тут запитання та відповіді, люди іноді взаємозамінно використовують терміни "функція" та "команда". В інших випадках люди використовують лише один із двох термінів для обговорення конкретних фрагментів коду. Оскільки їх публікації зазвичай зосереджуються на інших темах, вони не пояснюють, чому вони використовують один термін, а не інший. Так:

Питання: Яка різниця між функцією та командою у Emacs Lisp?


13
Ви маєте на це право, звичайно, і я впевнений, що цьому допоможуть деякі люди. Але FWIW Я не прихильник питань і відповідей тут на кожну дрібницю, яку, можливо, краще навчити когось запитувати Emacs про себе . Це одне таке, IMO - це не важко знайти це, і Emacs дає хорошу відповідь. C-h i, виберіть посібник Elisp , i command- ви поставите прямо у вузол What is a function?, що зробить все це кристально чистим. Допоможіть користувачам навчитися запитувати Emacs. (Лише одна думка.)
Дрю

1
Тим не менш, ти поставив і добре відповів на питання.
Дрю

5
@Drew Я погоджуюсь на 100% навчити людей першим запитувати Emacs. Основна мета цього конкретного запитання - полегшити правильне використання термінів і, якщо необхідно, довідатися користувачів про відмінності між командами та функціями: Іноді люди не знають, що це питання, яке їм слід задавати , і мати загальний ресурс для їх вказівки простіше, ніж повторювати той самий вміст знову і знову в коментарях.
itsjeyd

1
Це сказав, спасибі за те, що ви згадували, як знайти відповідну інформацію всередині Emacs :)
itsjeyd

1
Ми погоджуємось - йдеться про допомогу користувачам використовувати Emacs. Цей сайт є засобом для досягнення цієї мети.
Дрю

Відповіді:


44

Кожна команда - це функція, але не кожна функція також є командою. 1

Команда включає виклик до interactive; саме тому команди зазвичай називають "інтерактивними функціями". Команди можна викликати через M-x name-of-command RET, і вони також можуть бути прив'язані до ключової послідовності. Регулярні функції не включають дзвінок interactive, не можна викликати за допомогою M-x, і ви не можете прив'язувати їх до послідовності ключів. Щоб запустити функцію, яка не є інтерактивною, ви можете натиснути M-:( eval-expression), ввести ім'я функції, а потім значення для будь-яких аргументів, які потрібно вкласти в круглі дужки, і натисніть RET:

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

Якщо функція не повинна працювати на поточному буфері, ви також можете ввести

(name-of-function arg1 arg2 arg3)

у *scratch*буфері і натисніть C-x C-e( eval-last-sexp) з точкою, розташованою після дужки, що закривається.

Щоб зробити функцію barдоступною як команду, ви можете зв'язати її у власну інтерактивну функцію ( foo) наступним чином:

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

Звичайно, якщо ви barвізьмете один або кілька аргументів, вам доведеться подати їх, щоб зробити fooроботу правильно.

Якщо ви бачите людей, які взаємозамінно використовують терміни "функція" та "команда", це може вказувати (залежно від контексту), що вони не знають про відмінності між основними поняттями.


1 Зауважте, що я говорю defunтут про s. Як в коментарях зазначає @Stefan, макроси клавіатури є особливим випадком: їх можна вважати командами , але вони не є функціями.


5
Незначний нітпік: interactive"дзвінки" зазвичай називають деклараціями (сама функція насправді нічого не робить).
shosti

5
@itsjeyd: Насправді, ні, є також команди, які не є функціями. Це стосується макросів клавіатури . Напр., Вам M-: (commandp [?a]) RETбуде (коректність) сказати, що [?a]це команда, але це не функція.
Стефан

@Stefan Дякую, що вказали на це. Я оновив свою відповідь.
itsjeyd
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.