Common lisp 何时使用';(函数)在lambda表达式前面?

Common lisp 何时使用';(函数)在lambda表达式前面?,common-lisp,Common Lisp,我理解,因为在Common Lisp中函数和变量有单独的名称空间,所以您可以这样做: ((lambda (x) (* 2 x)) 3) (funcall #'(lambda (x) (* 2 x)) 3) 你也可以这样做: ((lambda (x) (* 2 x)) 3) (funcall #'(lambda (x) (* 2 x)) 3) 我们什么时候应该使用#“而不是不使用它?我在另一个StackOverflow问题中读到,#“只是出于历史原因而保留下来的,不应该再使用了。这是真的吗

我理解,因为在Common Lisp中函数和变量有单独的名称空间,所以您可以这样做:

((lambda (x) (* 2 x)) 3)
(funcall #'(lambda (x) (* 2 x)) 3)
你也可以这样做:

((lambda (x) (* 2 x)) 3)
(funcall #'(lambda (x) (* 2 x)) 3)

我们什么时候应该使用
#“
而不是不使用它?我在另一个StackOverflow问题中读到,
#“
只是出于历史原因而保留下来的,不应该再使用了。这是真的吗?我的问题不是重复的,我是问什么时候我会在我的代码中使用这些

这不是lisp-2和lisp-1的问题。由于
lambda
表达式处于需要函数值的位置,这只是一种风格选择。有些人喜欢
#“
的视觉标记,有些人不喜欢。已扩展为
函数
形式,其中
#
提供了一个缩写:

#'x
只是
(function x)
的语法糖,它提供了“名称在当前词汇环境中的功能价值”

function的值是当前文件中name的函数值 词汇环境

如果名称是函数名,则该名称的函数定义为 由最里面的词汇圈、标签或标签建立的 如果有,则为宏单元形式。否则,全局函数 返回函数名的定义

虽然
(lambda…
是一个函数的名称,但它不是一个可以由
flet
label
macrolet
表单建立的名称,因此您总是可以得到“函数名的全局定义”,这只是lambda函数。由于
(lambda…
扩展为
(函数(lambda…)
,所以没有区别。这只是风格的问题

但是,需要注意的是,在您提到的第一个案例中

((lambda (x) (* x 2)) 3)
你不能这样做:

((lambda…)
的支持是语言的一部分,与
lambda
作为宏的定义无关。这是一种特殊类型的,即a,在HyperSpec中描述:

lambda形式类似于函数形式,只是函数 名称替换为lambda表达式

lambda形式相当于使用 给定参数上的lambda表达式。(实际上,有些 编译器更有可能为lambda表单生成内联代码 对于已内联声明的任意命名函数; 然而,这种差异不是语义上的。)

有关详细信息,请参阅


你在说什么口齿不清?这两种形式在Common Lisp中都是非法的。@RainerJoswig强调了一点,这些形式在语法上是不正确的,但这是因为lambda列表
x
,而不是因为
((lambda…)
(funcall#')(lambda…)
在语法上是不正确的。你需要使用
((lambda(x)(*2x))3
(funcall#'(lambda(x)(*2x))3
。如果对另一个问题的回答说你不应该再使用它,那么询问你应该何时使用它可能是重复的。你能链接到另一个问题的上下文吗?这将使它是否是重复的更清楚。你是指吗?(+1)我只想知道你、雷纳和这个Lisp小组的其他一些人对Lisp的了解:)@mbrach给它一些时间,在comp.lang.Lisp上闲逛,浏览HyperSpec。它会随时间而来。:)