我有一个问题,当我想执行以下代码:如何正确使用emacs lisp语言中的lambda?
(defun sum1
(lambda (n)
(+ n 1)))
当我的Mx ielm运行出现一条消息:
无效的功能:(拉姆达(拉姆达(N) (+ N + 1))无)
我想弄清楚的是,虽然我可能会使用下面的代码:
(defun sum1(n)
(+ n 1))
我想知道如何在这种情况下定义lambda。
所有信息均被接受,我是新手。
我有一个问题,当我想执行以下代码:如何正确使用emacs lisp语言中的lambda?
(defun sum1
(lambda (n)
(+ n 1)))
当我的Mx ielm运行出现一条消息:
无效的功能:(拉姆达(拉姆达(N) (+ N + 1))无)
我想弄清楚的是,虽然我可能会使用下面的代码:
(defun sum1(n)
(+ n 1))
我想知道如何在这种情况下定义lambda。
所有信息均被接受,我是新手。
defun
用于声明一个函数。
在你用来声明一个变量并赋予它一个变量表达式这样方案:(define x variable-expression)
,并宣布一个功能,当你用来写这样的事情(define x function-expression)
。 Ofc variable-expression
可以是先前声明的另一个变量或文字(即define x 5
,define x y
)。
同为一个函数表达式,而是写一个函数,当“文字”你使用这样一个匿名函数是:
(define x (lambda (x) (....)))
其中lambda (x) (...)
是实际返回的函数,分配函数表达式到x。所以这样x被声明为一个函数。
defun
实际上声明了一个函数,而不是define
在方案中做的变量。所以,当你写:
(defun sum1
(lambda (n)
(+ n 1)))
真正的情况是,SUM1被声明为没有参数,返回实际接受可变n
并返回n+1
另一个函数的函数。
你真正想要的是sum1
被宣布为功能而不是函数返回另一个函数,这是你实际上在同一片段使用defun
和lambda
得到。
EDIT1:您可以使用函数这样((sum1) 5)
实际上你需要'(defun sum1()(lambda ...))':你需要arglist,也没有词法作用域(elisp没有默认)这个定义根本不起作用 – tfb
这是一个很长的解释,但并不是最清楚的,请告诉他如何解决他的问题\正确编写他的代码,就像@tfb在上面做的那样。 – user2141046
lambda
使一个功能,但并没有给它一个名字。无论何时需要创建一个功能,都可以使用它,但不需要命名。一个很好的例子是一个比较函数,它只用于一次排序列表。
(let ((l (number-sequence 1 10)))
(sort l (lambda (a b) (> a b)))) ;; reversed
这可能是恼人的defun
,你永远不会再次使用的功能。只需花一点点努力就可以得到一个名字,并且你需要确保你没有覆盖现有的函数(这并不是很难,我通常用我的首字母加前缀)。
lambda
(IMO)的常见滥用的示例是钩子。许多人会将lambda
s添加到钩子,但是如果您查看钩子变量的值,则会有一堆lisp,而不是可以运行describe-function
的函数名称。但更糟的是,您不能使用remove-hook
,或者在编写或调试函数时重新定义函数。
您可以宏展开“defun”并查看它是否正在执行'(defalias'sum1(lambda(n)(+ n 1)))' – jenesaisquoi
Lambda是一个匿名函数。真的不清楚你在问什么。你可以有,例如。 '(defun make-adder(n)(lambda(x)(+ x n)))'返回一个将n加到数字上的函数。你可以有一个匿名函数作为变量的值:'(let((adder(lambda(x)(+ x 2))))...)'。 –
我试图写一个适合新手的答案,但我意识到真正的答案是:如果你想学习lisp *不要从elisp *开始。取而代之的是Common Lisp(一种传统的,但比elisp更清晰的lisp),Scheme(更现代的lisp)或者其他的东西(Clojure?)。 elisp并没有错,但它确实是老式的:它的功能很好,但它不是如何学习Lisp,因为它会让你感到困惑。 (如果你想知道如何做的是黑客emacs,那么elisp是一个很好的开始当然。) – tfb