Common lisp 何时使用';(函数)在lambda表达式前面?
我理解,因为在Common Lisp中函数和变量有单独的名称空间,所以您可以这样做: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问题中读到,#“只是出于历史原因而保留下来的,不应该再使用了。这是真的吗
((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。它会随时间而来。:)