假设我想调用某个函数。如果我用 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
LAMBDA
Common Lisp 中有两个不同的目的:
- 这是一个的头拉姆达表达式.
- 作为宏
LAMBDA
。这扩大了(lambda ....)
into (function (lambda ....))
宏观LAMBDA
在第一个语言定义 CLtL1 之后添加到 Common Lisp 中,以便能够编写(lambda (x) x)
代替(function (lambda (x) x))
or #'(lambda (x) x)
。因此,它是函数特殊运算符形式的缩写,使代码看起来更简单类似方案.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)