#'foo
is an 缩写 http://www.lispworks.com/documentation/lw51/CLHS/Body/02_dhb.htm for (function foo)
由读者。
在CL中,有几种不同的命名空间,#'foo
or (function foo)
将返回的功能值foo
.
你可能想要搜索“Lisp-1 与 Lisp-2” https://www.startpage.com/do/metasearch.pl?query=Lisp-1%20vs.%20Lisp-2,检查其他堆栈溢出问题 https://stackoverflow.com/questions/1020968/separate-namespaces-for-functions-and-variables-in-common-lisp-versus-scheme,或阅读皮特曼和加布里埃尔的旧文章 http://www.dreamsongs.com/Separation.html为了更多地了解多个命名空间(也称为符号的槽或单元)的概念。
原因是,在 lambda 的情况下,#'
CL 中可以省略的是它是一个宏,因此扩展(取自超规格 http://www.lispworks.com/documentation/lw51/CLHS/Body/m_lambda.htm):
(lambda lambda-list [[declaration* | documentation]] form*)
== (function (lambda lambda-list [[declaration* | documentation]] form*))
== #'(lambda lambda-list [[declaration* | documentation]] form*)
#'
由于历史原因可能仍会被使用(我认为在 Maclisplambda
s 没有扩展到函数形式),或者因为有些人认为,用尖引号标记 lambda 可能会使代码更具可读性或连贯性。在某些特殊情况下,这可能会产生影响,但一般来说,您选择哪种形式并不重要。
我想你可以这样想:(function (lambda ...))
返回函数(lambda ...)
创造。注意lambda
在 CL Hyperspec 中两者都有一个宏和一个符号条目 http://www.lispworks.com/documentation/HyperSpec/Body/a_lambda.htm。从后者来看:
lambda 表达式是一个列表,可以
用来代替函数名
某些上下文来表示函数
通过直接描述其行为
而不是间接地引用
已建立的函数的名称。
来自文档 http://clhs.lisp.se/Body/s_fn.htm of function
:
如果 name 是 lambda 表达式,则
返回词法闭包。
我认为差异也与调用 lambda 形式有关,如下所示:((lambda ...) ...)
它被视为要评估的形式,而不是(funcall #'(lambda ...) ...)
。如果您想了解有关该主题的更多信息,可以阅读c.l.l 线程 http://groups.google.com/group/comp.lang.lisp/browse_thread/thread/e842449e3bac2555/07d63dde2c79d02f?#07d63dde2c79d02f关于它。
该线程的一些引用:
(lambda (x) ...
其本身只是一些
不带引号的列表结构。是它的
外观作为参数
FUNCTION 特殊形式(function
(lambda (x) ...
这导致
函数对象存在
and:
更复杂的事实是
LAMBDA 宏是一个相当晚的
另外 ANSI Common Lisp,所以所有
真正的老家伙(即像我一样)
当你需要的时候学会他们的口齿不清
将 #' 提供给 lambda 表达式
在映射函数中。否则
不存在的 lambda 函数将
被调用。
宏的添加改变了这一点,但是
我们中的一些人太固执于自己的方式
想要改变。