我熟悉Emacs Lisp,但不熟悉Common(或任何其他)Lisp。一些Lisp程序员建议(例如A basic function for emacs)在Lisp代码中的函数参数前面使用#'
是很好的。例如:
(mapc #'my-fun '(1 2 3))
在Emacs Lisp中,我相信这相当于
(mapc 'my-fun '(1 2 3))
从elisp手册,第12.7节。
读取语法
#'
是使用function
的简写。该 以下表格都是等效的:(lambda (x) (* x x)) (function (lambda (x) (* x x))) #'(lambda (x) (* x x))
以及function
函数是
eval.c
中的一种特殊形式。(function ARG)
与
quote
类似,但对于作为函数的对象更喜欢。在字节中 编译,function
导致其参数被编译。quote
不能这样做。
所以它似乎是一种潜在的优化,但不再是。此外,来自ML / Haskell背景,以不同于任何其他数据的方式处理函数似乎很奇怪。
您是否同意在#'
函数参数中使用emacs-lisp
?
(简要解释为什么在Common Lisp中需要它们也会很棒。)
我认为省略#'
(值与功能)时可能会读取不同的单元格。但
这似乎是错误的,因为function
的文档没有说明抓取功能单元格。这是通过使用symbol-function
实现的。
相关问题是
但他们似乎认为#'
是不必要的,至少在lambdas中是这样。
答案 0 :(得分:18)
#'foo
中的引号字符与'foo
中的引号字符无关。
#'foo
在读取时间被(function foo)
替换。编译并执行该操作时,它会查找由foo
(defun
,flet
,labels
或类似名称)命名的功能定义。
'foo
在读取时间被(quote foo)
替换。编译和执行时,它只需用符号foo
替换。
Funcall
和apply
(以及通常更高阶的函数)将函数指示符作为参数。 函数指示符可以是命名函数的函数或符号,因此#'foo
和'foo
都是函数指示符。
因此,表格'foo
和#'foo
乍一看似乎可以互换。但是,实际函数的查找是在不同的时间完成的 - 查询调用它的位置#'foo
,而'foo
命名的函数只有在最终应用时才会查找。
如果多次使用函数指示符,那么只进行一次查找或者甚至只是在编译时进行查找会更有效。这可以节省大量时间,并在编辑器中转化为更流畅的用户体验。