gpt4 book ai didi

common-lisp - 为什么在Common Lisp中的lambda之前使用#'?

转载 作者:行者123 更新时间:2023-12-03 07:59:55 26 4
gpt4 key购买 nike

我想知道为什么我看到的大多数Common Lisp代码都有类似
(mapcar #'(lambda (x) (* x x)) '(1 2 3))
而不只是
(mapcar (lambda (x) (* x x)) '(1 2 3))

这似乎也可以。我开始学习Common Lisp,并且在Scheme中有一定背景,这引起了我的兴趣。

编辑:我知道您需要带函数名的#',因为它们与变量位于不同的命名空间中。我的问题是关于lambda的#',因为lambda已经返回了一个函数对象(我认为)。少#'的lambda由于宏扩展而起作用的事实使其变得更加有趣...

最佳答案

#'foo是读者的(function foo)abbreviation

在CL中,有几种不同的 namespace ,#'foo(function foo)将返回foo的功能值。

您可能想要search for "Lisp-1 vs. Lisp-2",检查其他Stackoverflow questions或阅读old article by Pitman and Gabriel,以了解有关多个 namespace (也称为符号的插槽或单元)的更多信息。

在lambda的情况下,CL中可以省略#'的原因是它是一个宏,因此扩展了(取自Hyperspec):

(lambda lambda-list [[declaration* | documentation]] form*)
== (function (lambda lambda-list [[declaration* | documentation]] form*))
== #'(lambda lambda-list [[declaration* | documentation]] form*)

出于历史原因,仍可能使用 #'(我认为在Maclisp中 lambda并未扩展为函数形式),或者因为某些人认为,使用尖引号标记lambda可能会使代码更具可读性或连贯性。在某些特殊情况下,这会有所作为,但总的来说,选择哪种形式并不重要。

我想您可以这样想: (function (lambda ...))返回 (lambda ...)创建的函数。请注意,CL Hyperspec中的 lambda都具有 a macro AND a symbol entry。从后者:

A lambda expression is a list that can be used in place of a function name in certain contexts to denote a function by directly describing its behavior rather than indirectly by referring to the name of an established function.



functiondocumentation中:

If name is a lambda expression, then a lexical closure is returned.



我认为差异也与调用lambda表单有关,如下所示: ((lambda ...) ...)(funcall #'(lambda ...) ...)一起被视为要评估的表单。如果您想阅读更多有关该主题的信息,请参阅 c.l.l thread

该线程的一些引号:

(lambda (x) ... by itself is just some unquoted list structure. It is its appearance as an argument to the FUNCTION special form (function
(lambda (x) ...
that causes the function object to exist



和:

It's also compounded by the fact that the LAMBDA macro was a rather late addition the ANSI Common Lisp, so all of the really old guys (i.e., like me) learned their lisp when you needed to supply the #' to the lambda expression in the mapping functions. Otherwise the non-existent lambda function would be invoked.

The macro addition changed that, but some of us are too set in our ways to want to change.

关于common-lisp - 为什么在Common Lisp中的lambda之前使用#'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3325499/

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