为什么 Common-Lisp Lambda 表达式是有效的函数名称?

2023-12-22

假设我想调用某个函数。如果我用 defun 定义了函数,我只需在列表的开头使用函数的名称,后跟它的参数,如下所示(我将在示例中使用“=>”来显示输入代码的输出进入 CLIsp REPL):

(defun f (a) (lambda (b) (+ a b))) => F
(f 12) => #<FUNCTION :LAMBDA (B) (+ A B)>

够简单的。列表的第一个元素必须是函数、特殊运算符或宏的名称。除此之外,以下内容也有效:

((lambda (a) (+ a 12)) 1) => 13

快速谷歌搜索显示 LAMBDA 既是一个符号又是一个宏。尝试扩大宏观产量:

(macroexpand '(lambda (a) (+ a 12))) => #'(LAMBDA (A) (+ A 12))

这没有帮助。我无法区分宏 LAMBDA 和符号 LAMBDA,而且我完全不清楚为什么我可以使用 lambda 表达式作为函数名称,但不能使用 #'f,据我所知,应该以与 #'(LAMBDA (A) (+ A 12)) 相同的方式评估函数 F 的有效函数指示符,但是:

(#'f 12) => *** - EVAL: #'F is not a function name; try using a symbol instead

LAMBDA 是对计算表达式的第一个元素这一硬性规则的特殊例外吗?must是某些操作的名称,还是有一些我误解的更一致的规则集?


Lambda 表达式和函数名称

A 拉姆达表达式不是一个函数名. 函数名在 Common Lisp 中被定义为symbols or (setf符号). A 拉姆达表达式基本上是描述匿名函数的内置语法。

请注意,lambda 表达式本身在 Common Lisp 中没有意义。他们只出现在一个拉姆达形式(见下文)并在带有特殊运算符的表单内function.

列表形式

LAMBDA 是对其他硬性规则的特殊例外,即求值表达式的第一个元素必须是某个操作的名称,还是有一些我误解的更一致的规则集?

Common Lisp 规范定义只有四种基于列表的forms. A form是一段有效的 Lisp 代码。

  • 特殊形式(形式以特殊运算符开头)
  • 宏形式(形式以宏运算符开头)
  • 函数形式(形式以函数运算符开头)
  • lambda 形式(该形式以 lambda 表达式开头)

请参阅 Common Lisp HyperSpec:形式的缺点 http://www.lispworks.com/documentation/HyperSpec/Body/03_abab.htm.

请注意,Common Lisp 中没有机制可以扩展此功能。基于列表的表单只有这四种类型。人们可以想到扩展:数组作为函数,CLOS 对象作为函数,不同类型的函数,如 fexprs、变量……基于列表的表单的 Common Lisp 语法不支持这些功能,并且没有可移植的机制来添加这些功能。

LAMBDA

LAMBDACommon Lisp 中有两个不同的目的:

  • 这是一个的头拉姆达表达式.
  • 作为宏LAMBDA。这扩大了(lambda ....) into (function (lambda ....))

宏观LAMBDA在第一个语言定义 CLtL1 之后添加到 Common Lisp 中,以便能够编写(lambda (x) x)代替(function (lambda (x) x)) or #'(lambda (x) x)。因此,它是函数特殊运算符形式的缩写,使代码看起来更简单类似方案.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Common-Lisp Lambda 表达式是有效的函数名称? 的相关文章

随机推荐