从文档中的function表格:
像`quote',但是对于作为函数的对象更喜欢.在字节编译中,`function'导致其参数被编译.`quote'不能那样做.
因此#'(lambda ...),可以启用lambda表单的字节编译.
另一方面,如手册中所述,不再需要.
lambda形式还有另一个作用:它通过使用
function子程序告诉Emacs求值程序和字节编译器它的参数是一个函数 .
[...]以下表格均相同:
(lambda (x) (* x x))
(function (lambda (x) (* x x)))
#'(lambda (x) (* x x))
Run Code Online (Sandbox Code Playgroud)
在这种情况下,这使得函数形式无用.
还有其他情况,函数形式会有用吗?
有什么情况下它的存在既不必要也不相同quote?
Ste*_*fan 12
#'(又名function)在内部使用lambda,因为它lambda被定义为一个包裹自身的宏function.但除此之外,您确实可以在不使用的情况下编写任何Elisp代码#'.还有另外一个细微之处,如果你写的#'foo话告诉Emacs你认为它foo是一个函数的名称,那么字节编译器的最新版本会发出警告,如果foo它不是一个已知的函数(就像他们一直警告的那样)(foo ...)已经召唤多年了).
正如@Bruce指出的那样,使用#'foo而不是对'foo通过cl-flet或本地定义的函数产生真正的区别cl-labels:在这种情况下#'foo是指本地定义的函数,而'foo只是引用foo符号,它实际上与本地不相关函数定义,因此可以通过解绑或绑定到另一个函数:
(cl-flet ((a () 1)) (list 'a (functionp 'a) #'a))
Run Code Online (Sandbox Code Playgroud)
回报
(a nil (lambda nil 1))
Run Code Online (Sandbox Code Playgroud)