夏普引用lambda时调用非法函数
如果这两个表达式相等夏普引用lambda时调用非法函数,lambda,lisp,common-lisp,Lambda,Lisp,Common Lisp,如果这两个表达式相等 CL-USER> (lambda (x) (+ x 10)) #<FUNCTION (LAMBDA (X)) {530321CB}> CL-USER> #'(lambda (x) (+ x 10)) #<FUNCTION (LAMBDA (X)) {5303226B}> 而这 CL-USER> ((lambda (x) (+ x 10)) 10) 20 (5 bits, #x14, #o24, #b10100) 效果很好吗 P
CL-USER> (lambda (x) (+ x 10))
#<FUNCTION (LAMBDA (X)) {530321CB}>
CL-USER> #'(lambda (x) (+ x 10))
#<FUNCTION (LAMBDA (X)) {5303226B}>
而这
CL-USER> ((lambda (x) (+ x 10)) 10)
20 (5 bits, #x14, #o24, #b10100)
效果很好吗
PS我正在使用SBCL。不同的有效lambda
(lambda (x) (+ x 10))
LAMBDA
是一个宏,可扩展为(函数(LAMBDA…)
#'
是一个读卡器宏,它在读取时扩展为(函数…
)
((lambda…)
是公共Lisp中的内置语法。它被定义为一个有效的表单,一个有效的Lisp表达式
使用LAMBDA的Lisp表单语法无效
((函数(lambda…))
在Lisp中是无效语法
复合Lisp表单的有效语法
(lambda (x) (+ x 10))
在Common Lisp中,只有以下复合形式有效:
用于一个内置特殊运算符(…)
(…)
(…)
(…)
((λ(x)(1+x))41)
其他语法变体在Common Lisp中无效。因此,((函数(lambda…))
和(#’(lambda…)
是无效语法
注意
上面有点令人困惑,但语言标准中就是这样定义的。在最初设计Common Lisp之后,添加了lambda
宏。它允许我们编写类似于方案的代码:
(mapcar (lambda (x) (+ x 2)) '(1 2 3))
但列表中的第一个元素仍然不会像Scheme中那样被计算。不同的有效lambda
(lambda (x) (+ x 10))
LAMBDA
是一个宏,可扩展为(函数(LAMBDA…)
#'
是一个读卡器宏,它在读取时扩展为(函数…
)
((lambda…)
是公共Lisp中的内置语法。它被定义为一个有效的表单,一个有效的Lisp表达式
使用LAMBDA的Lisp表单语法无效
((函数(lambda…))
在Lisp中是无效语法
复合Lisp表单的有效语法
(lambda (x) (+ x 10))
在Common Lisp中,只有以下复合形式有效:
用于一个内置特殊运算符(…)
(…)
(…)
(…)
((λ(x)(1+x))41)
其他语法变体在Common Lisp中无效。因此,((函数(lambda…))
和(#’(lambda…)
是无效语法
注意
上面有点令人困惑,但语言标准中就是这样定义的。在最初设计Common Lisp之后,添加了lambda
宏。它允许我们编写类似于方案的代码:
(mapcar (lambda (x) (+ x 2)) '(1 2 3))
但列表的第一个元素仍然不是像Scheme中那样被计算的。原因只是一个语法规则:要解释为函数调用的表单可以是(参见公共Lisp): a) 函数形式,一种形式,它是一个列表,具有第一个元素,该元素是要在参数上调用的函数的名称,该参数是对函数形式的后续元素求值的结果 b) lambda表单,该表单是一个列表,其第一个元素是lambda表达式,表示在参数上调用的函数,参数是lambda表单后续元素求值的结果 换句话说,必须解释为函数调用的形式的列表可以仅具有符号、函数名或以
lambda
开头的列表(即lambda表达式)作为第一个元素。不允许使用其他表达式(并且#'x
只是(函数x)
的缩写,这不是两种情况之一)
这是因为众所周知,Common Lisp遵循Lisp-2模型(请参见)。原因只是一个语法规则:要解释为函数调用的表单可以是(请参见Common Lisp): a) 函数形式,一种形式,它是一个列表,具有第一个元素,该元素是要在参数上调用的函数的名称,该参数是对函数形式的后续元素求值的结果 b) lambda表单,该表单是一个列表,其第一个元素是lambda表达式,表示在参数上调用的函数,参数是lambda表单后续元素求值的结果 换句话说,必须解释为函数调用的形式的列表可以仅具有符号、函数名或以
lambda
开头的列表(即lambda表达式)作为第一个元素。不允许使用其他表达式(并且#'x
只是(函数x)
的缩写,这不是两种情况之一)
这是由于众所周知的事实,即公共Lisp遵循Lisp-2模型(请参阅)