函数和命令有什么区别?


35

在此处发布问题和答案时,人们有时会互换使用术语“功能”和“命令”。在其他情况下,人们仅使用两个术语之一来讨论特定的代码段。由于他们的帖子通常专注于其他主题,因此他们没有解释为什么使用一个术语而不使用另一个术语。所以:

问:在Emacs Lisp中,函数和命令有什么区别?


13
您当然有权这样做,而且我敢肯定,某些​​人会对此有所帮助。但是FWIW对于每一个小事情我都不赞成在这里进行问答,最好教别人问一下Emacs本身。IMO就是这样一个例子-不难发现,Emacs提供了一个很好的答案。C-h i,选择的elisp手册i command-让您身在节点What is a function?,这使得这一切一清二楚。帮助用户学习询问Emacs。(只有一种意见。)
Drew

1
就是说,您提出并很好地回答了问题。
2014年

5
@Drew我同意100%教人先问Emacs。此特定问题解答的主要目的是使促进术语的正确使用更加容易,并在必要时使用户意识到命令和功能之间的差异:有时,人们并不知道这是他们应该问的问题,与在注释中一遍又一遍地重复相同的内容相比,拥有通用的资源来指向它们更容易。
itsjeyd 2014年

1
就是说,感谢您提到如何在Emacs中查找相关信息:)
itsjeyd 2014年

1
我们同意-这是关于帮助用户使用Emacs。此站点是为此目的的一种手段。
提请2014年

Answers:


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-eeval-last-sexp),使点位于右括号之后。

要使函数bar作为命令可用,可以将其包装在自定义的交互式函数(foo)中,如下所示:

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

当然,如果bar接受一个或多个参数,则必须提供它们才能foo正常工作。

如果您看到人们交替使用术语“功能”和“命令”,则可能表明(取决于上下文)他们并不了解基本概念之间的差异。


1请注意,我在defun这里谈论s。正如@Stefan在注释中指出的那样,键盘宏是一种特殊情况:它们可以被视为命令,但它们不是函数。


5
次要nitpick:interactive“调用”通常称为声明(函数本身实际上不执行任何操作)。
shosti

5
@itsjeyd:实际上,不,还有不是功能的命令。键盘宏就是这种情况。例如M-: (commandp [?a]) RET(正确)会告诉您这[?a]是一个命令,但不是功能。
斯特凡2015年

@Stefan感谢您指出这一点。我更新了答案。
itsjeyd
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.