为什么在emacs-lisp中的函数参数之前使用#'?

时间:2013-08-22 20:52:00

标签: emacs lisp elisp common-lisp

我熟悉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中是这样。

1 个答案:

答案 0 :(得分:18)

#'foo中的引号字符与'foo中的引号字符无关。

#'foo读取时间(function foo)替换。编译并执行该操作时,它会查找由foodefunfletlabels或类似名称)命名的功能定义

'foo读取时间(quote foo)替换。编译和执行时,它只需用符号foo替换。

Funcallapply(以及通常更高阶的函数)将函数指示符作为参数。 函数指示符可以是命名函数的函数或符号,因此#'foo'foo都是函数指示符。

因此,表格'foo#'foo乍一看似乎可以互换。但是,实际函数的查找是在不同的时间完成的 - 查询调用它的位置#'foo,而'foo命名的函数只有在最终应用时才会查找。

如果多次使用函数指示符,那么只进行一次查找或者甚至只是在编译时进行查找会更有效。这可以节省大量时间,并在编辑器中转化为更流畅的用户体验。