如何在elisp的

问题描述:

返回功能这涉及到这样一个问题:elisp functions as parameters and as return value如何在elisp的

(defun avg-damp (n) 
    '(lambda(x) (/ n 2.0))) 

要么

(funcall (avg-damp 6) 10) 

((avg-damp 6) 10) 

他们给的分别Symbol's value as variable is void: neval: Invalid function: (avg-damp 6)错误。

+0

请不要引用你的lambda表达式。除此之外,您的示例将在最近的Emacs中工作,只要您在缓冲区中将'lexical-binding'设置为't'。 – Stefan 2013-05-04 23:22:04

第一形式不工作的原因是,n结合动态,不词法:

(defun avg-damp (n) 
    (lexical-let ((n n)) 
    (lambda(x) (/ x n)))) 
(funcall (avg-damp 3) 12) 
==> 4 

第二形式不工作的原因是,Emacs的Lisp是一样的Common Lisp,a "lisp-2", not a "lisp-1"

+2

只需注意:lisp-1和lisp-2之间的区别在于符号是否仅具有值绑定(lisp-1)或值绑定和函数绑定。 lisp-2仍然可以有一个评估语义:“评估(f a1 a2 ...),如果f是一个符号,将其函数绑定到a1 a2 ...,否则如果f是复合形式,则评估它并应用导致a1 a2 ...“。在Common Lisp中,我们已经可以做((lambda(x)(list x x))4)并且得到(4 4)。我认为支持((...)...)的lisp仍然可以是lisp-2,只要(f ...)只应用f的函数绑定,而不是值绑定。 – 2013-05-02 19:35:45

+3

@JoshuaTaylor'((lambda(...)...))'是Cl中的一个特例。通常,当你计算一个函数时,你会得到值“binding”(well,value),但是'(lambda(...)...)* * only *具有函数“value”而不是一般值,所以它已被明确允许。 – Vatine 2013-05-03 11:43:06

+0

@Vatine绝对正确。如果没有CL这种特殊情况,我们会'(让((f(lambda(...))))(应用f ...))'就像我们为非'lambda'形式做的那样。不过,我的观点是,功能位置中的非符号,函数生成表单并不需要进行任何修改来分离函数和值名称空间。 (在CL中,其他东西(例如符号宏)可能会导致问题。)如果某些lisp允许在函数位置中使用非符号,函数生成表单,并且具有单独的函数和值名称空间,则我更倾向于称它一个lisp-2比一个lisp-1。 – 2013-05-03 13:00:20