(功能)在Emacs中是否有任何用途?

Mal*_*rba 7 lisp emacs elisp

文档中的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)