2017-03-13 95 views
0

我有一个问题,当我想执行以下代码:如何正确使用emacs lisp语言中的lambda?

(defun sum1 
     (lambda (n) 
     (+ n 1))) 

当我的Mx ielm运行出现一条消息:

无效的功能:(拉姆达(拉姆达(N) (+ N + 1))无)

我想弄清楚的是,虽然我可能会使用下面的代码:

(defun sum1(n) 
     (+ n 1)) 

我想知道如何在这种情况下定义lambda。

所有信息均被接受,我是新手。

+3

您可以宏展开“defun”并查看它是否正在执行'(defalias'sum1(lambda(n)(+ n 1)))' – jenesaisquoi

+3

Lambda是一个匿名函数。真的不清楚你在问什么。你可以有,例如。 '(defun make-adder(n)(lambda(x)(+ x n)))'返回一个将n加到数字上的函数。你可以有一个匿名函数作为变量的值:'(let((adder(lambda(x)(+ x 2))))...)'。 –

+0

我试图写一个适合新手的答案,但我意识到真正的答案是:如果你想学习lisp *不要从elisp *开始。取而代之的是Common Lisp(一种传统的,但比elisp更清晰的lisp),Scheme(更现代的lisp)或者其他的东西(Clojure?)。 elisp并没有错,但它确实是老式的:它的功能很好,但它不是如何学习Lisp,因为它会让你感到困惑。 (如果你想知道如何做的是黑客emacs,那么elisp是一个很好的开始当然。) – tfb

回答

2

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被宣布为功能而不是函数返回另一个函数,这是你实际上在同一片段使用defunlambda得到。

EDIT1:您可以使用函数这样((sum1) 5)

+0

实际上你需要'(defun sum1()(lambda ...))':你需要arglist,也没有词法作用域(elisp没有默认)这个定义根本不起作用 – tfb

+0

这是一个很长的解释,但并不是最清楚的,请告诉他如何解决他的问题\正确编写他的代码,就像@tfb在上面做的那样。 – user2141046

2

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,或者在编写或调试函数时重新定义函数。