Function 如何在elisp中返回函数

Function 如何在elisp中返回函数,function,lisp,return,elisp,Function,Lisp,Return,Elisp,这与这个问题有关: 或者 (funcall (avg-damp 6) 10) 或 他们给出了符号值的错误,因为变量为void:n和eval:Invalid function:(avg damp 6)。第一种形式不起作用的原因是n是动态绑定的,而不是词汇绑定的: (defun avg-damp (n) (lexical-let ((n n)) (lambda(x) (/ x n)))) (funcall (avg-damp 3) 12) ==> 4 第二种形式不起作用的原因是

这与这个问题有关:

或者

(funcall (avg-damp 6) 10)


他们给出了
符号值的错误,因为变量为void:n
eval:Invalid function:(avg damp 6)

第一种形式不起作用的原因是
n
是动态绑定的,而不是词汇绑定的:

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

第二种形式不起作用的原因是,Emacs Lisp与Common Lisp一样,只是一个注释:Lisp-1和Lisp-2之间的区别在于符号是否只有值绑定(Lisp-1)或值绑定和函数绑定。lisp-2仍然可以有一个求值语义,即“要求值(f a1 a2…),如果f是符号,将其函数绑定到a1 a2…,否则如果f是复合形式,则求值并将结果应用到a1 a2…”。在CommonLisp中,我们已经可以执行((lambda(x)(list x))4)和get(4)。我认为支持((…)…)的lisp仍然可以是lisp-2,只要(f…)只应用f的函数绑定,而不是值绑定。@JoshuaTaylor
((lambda(…)…)…)
是Cl中的一个特例。通常,无论何时计算函数,都会得到值“binding”(嗯,value),但
(lambda(…)…)
只有一个函数“value”,而不是一个常规值,所以它被明确允许。@Vatine完全正确。如果没有这个特殊情况,我们将
(让((f(lambda(…))))(应用f…)
就像我们对非
lambda
表单所做的那样。不过,我的观点是,在函数位置生成非符号函数的表单基本上不需要任何修改来分隔函数和值名称空间。(在CL中,其他东西(例如,符号宏)可能会导致问题。)如果某些lisp允许在函数位置使用非符号、函数生成形式,并且有单独的函数和值命名空间,我更倾向于将其称为lisp-2而不是lisp-1。有没有一种方法可以在不使用funcall的情况下调用此函数:例如(#’(avg dump 5)10)。我找不到别的办法,只有一个办法。看起来有点难看。@yilmazhuseyin:不。你必须使用
funcall
apply
。请不要引用你的lambdas。除此之外,您的示例将在最近的Emacs中运行,前提是您在缓冲区中执行此操作,您已将
词法绑定设置为
t
((avg-damp 6) 10)
(defun avg-damp (n)
  (lexical-let ((n n))
    (lambda(x) (/ x n))))
(funcall (avg-damp 3) 12)
==> 4