夏普引用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中,只有以下复合形式有效:

  • (…)
    用于一个内置特殊运算符
  • (…)
  • (…)
  • (…)
运算符是符号。后者的第一个元素是lambda表达式。例如:

((λ(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中,只有以下复合形式有效:

  • (…)
    用于一个内置特殊运算符
  • (…)
  • (…)
  • (…)
运算符是符号。后者的第一个元素是lambda表达式。例如:

((λ(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模型(请参阅)