当我想执行以下代码时,我遇到了问题:
(defun sum1
(lambda (n)
(+ n 1)))
当我使用M-x ielm运行时出现下一条消息:
无效的功能:( lambda(lambda(n)(+ n 1))nil)
我想说清楚,虽然我可能会使用以下代码:
(defun sum1(n)
(+ n 1))
我想知道在这种情况下如何定义lambda。
所有信息都被接受,我是新手。
答案 0 :(得分:2)
defun
用于声明一个函数。
在方案中,您曾经声明一个变量,并为其分配了一个变量表达式,如下所示:(define x variable-expression)
,并且在声明一个函数时,您曾经写过这样的函数(define x function-expression)
。 Ofc variable-expression
可以是先前声明的另一个变量或文字(define x 5
,define x y
)。
对于函数表达式也一样,但是在编写函数'literal'时,你可以使用这样的匿名函数来完成它:
(define x (lambda (x) (....)))
其中lambda (x) (...)
是一个实际返回函数并分配给x的函数表达式。所以这种方式x被声明为一个函数。
defun
实际上声明了一个函数,而不是define
中的变量。所以当你写:
(defun sum1
(lambda (n)
(+ n 1)))
真正发生的是sum1被声明为一个没有参数的函数,它返回另一个实际接受变量n
并返回n+1
的函数。
您真正想要的是sum1
被声明为函数而不是函数返回另一个函数,这是您实际使用的<{1}}和defun
位于同一代码段中。
EDIT1:您可以使用此功能lambda
答案 1 :(得分:2)
lambda
创建了一个函数,但没有给它起一个名字。在需要创建函数时使用它,但不需要为其命名。一个很好的例子是比较函数,它仅用于对列表进行排序。
(let ((l (number-sequence 1 10)))
(sort l (lambda (a b) (> a b)))) ;; reversed
defun
一个你永远不会再使用的功能可能很烦人。想出一个名字需要花费一点点努力,你需要确保你不会覆盖现有的功能(这并不是很难,我通常在我的函数前加上我的首字母)
lambda
(IMO)常见滥用的一个例子是钩子。很多人会将lambda
添加到钩子中,但是如果你看一下钩子变量的值,你就会有一堆lisp而不是你可以运行describe-function
的函数名。但更糟糕的是,您无法使用remove-hook
,或在您编写或调试功能时重新定义该功能。