我熟悉 Emacs Lisp,但不熟悉 Common(或任何其他)Lisp。一些 Lisp 程序员建议(例如emacs 的基本功能 https://stackoverflow.com/questions/17076646/a-basic-function-for-emacs/17078405?noredirect=1#comment27008144_17078405)这很好用#'
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)
Like quote
,但对于函数对象来说是首选。以字节为单位
汇编,function
导致其参数被编译。quote
不可以这样做。
所以这似乎是一个潜在的优化,但仅此而已。此外,由于具有 ML/Haskell 背景,以不同于任何其他数据的方式对待函数似乎很奇怪。
问题:
你同意吗#'
应该用在emacs-lisp
函数参数?
(简要解释一下为什么 Common Lisp 需要它们也很好。)
Notes:
我认为当#'
被省略(值与函数)。但
这似乎是错误的,因为文档function
没有说任何关于抓取功能单元的内容。这是通过使用实现的symbol-function
.
相关问题有
- Common Lisp 中的 #' https://stackoverflow.com/questions/14021965/the-in-common-lisp
- 在 Common Lisp 中编写 Lambda 表达式 https://stackoverflow.com/questions/13213611/writing-lambda-expressions-in-common-lisp
- 为什么 Common Lisp 中的 lambda 之前使用#'? https://stackoverflow.com/questions/3325499/why-is-used-before-lambda-in-common-lisp/3325572#3325572
但他们似乎建议#'
至少在 lambda 中是不必要的。
中的引号字符#'foo
与其中的一个无关'foo
.
#'foo
被替换为阅读时间 by (function foo)
。当编译并执行时,它会查找功能定义命名为foo
(by defun
, flet
, labels
或类似)。
'foo
被替换为阅读时间 by (quote foo)
。当它被编译和执行时,它只是被符号替换foo
.
Funcall
and apply
(因此通常是高阶函数)功能指示符作为参数。 A功能指示符可以是函数或命名函数的符号,因此两者#'foo
and 'foo
是功能指示符。
因此,表格'foo
and #'foo
乍一看似乎可以互换。然而,实际函数的查找是在不同时间完成的——#'foo
在调用它的地方查找,而由'foo
只有在最终应用时才会被查找。
如果多次使用函数指示符,则仅进行一次查找甚至仅在编译时进行查找会更有效。这确实可以节省大量时间,并转化为编辑器中更流畅的用户体验。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)