gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:32:58 24 4
gpt4 key购买 nike

我熟悉 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 节。

The read syntax #' is a short-hand for using function. The following forms are all equivalent:

 (lambda (x) (* x x))
(function (lambda (x) (* x x)))
#'(lambda (x) (* x x))

以及函数的帮助

function is a special form in eval.c.

(function ARG)

Like quote, but preferred for objects which are functions. In byte compilation, function causes its argument to be compiled. quote cannot do that.

所以这似乎是一个潜在的优化,但仅此而已。此外,从 ML/Haskell 的背景来看,将函数与任何其他数据区别对待似乎很奇怪。

问题:

您是否同意在 emacs-lisp 函数参数中使用 #'?(简单解释一下为什么 Common Lisp 需要它们也很好。)

注意事项:

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

相关问题是

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

最佳答案

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

#'foo读取时 被替换为 (function foo)。当它被编译和执行时,它会查找由 foo 命名的功能定义(通过defunfletlabels 或类似标签)。

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

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

因此,形式 'foo#'foo 乍一看似乎可以互换。然而,实际函数的查找是在不同的时间完成的——#'foo 在它被调用的地方查找,而由 'foo 命名的函数只会被查找最终应用时向上。

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

关于emacs - 为什么在 emacs-lisp 中的函数参数前使用#'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18390586/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com