18

我熟悉 Emacs Lisp,但不熟悉 Common(或任何其他)Lisp。一些 Lisp 程序员建议(例如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 中需要它们也很好。)

笔记:

我认为#'省略时它可能会读取不同的单元格(值与函数)。但这似乎是错误的,因为 for 的文档function没有说明任何关于抓取功能单元的内容。这是通过使用symbol-function.

相关问题是

但他们似乎暗示这#'是不必要的,至少在 lambdas 中是这样。

4

1 回答 1

21

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

#'foo读取时由替换(function foo)。当它被编译和执行时,它会查找由(by 、或类似名称)命名的函数定义。foodefunfletlabels

'foo读取时由替换(quote foo)。当它被编译和执行时,它被简单地替换为符号foo

Funcall并且apply(因此通常是高阶函数)将函数指示符作为参数。功能指示符可以是功能或命名功能的符号,因此两者#'foo都是'foo功能指示符。

因此,乍一看,形式'foo和似乎可以互换。#'foo然而,真正的函数的查找是在不同的时间完成的——#'foo在它被调用的地方查找,而名为 by 的函数'foo只有在它最终被应用时才会被查找。

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

于 2013-08-22T21:25:12.407 回答