在clisp中返回lambda函数,然后对其求值

在clisp中返回lambda函数,然后对其求值,lisp,lambda,common-lisp,Lisp,Lambda,Common Lisp,假设我有一个很棒的函数foo [92]> (defun foo () (lambda() 42)) FOO [93]> (foo) #<FUNCTION :LAMBDA NIL 42> [94]> [92]>(defun foo()(lambda()42)) 福 [93]>(foo) # [94]> 现在,假设我想实际使用foo并返回42 我该怎么做?我一直在谷歌搜索,似乎找不到正确的语法。你想要这个函数: * (defun foo () (lambda (

假设我有一个很棒的函数foo

[92]> (defun foo () (lambda() 42))
FOO
[93]> (foo)
#<FUNCTION :LAMBDA NIL 42>
[94]> 
[92]>(defun foo()(lambda()42))
福
[93]>(foo)
#
[94]> 
现在,假设我想实际使用foo并返回42

我该怎么做?我一直在谷歌搜索,似乎找不到正确的语法。

你想要这个函数:

* (defun foo () (lambda () 42))
FOO
* (funcall (foo))
42

函数
foo
返回一个值。使用函数将函数应用于参数,即使参数集为空

在这里您可以看到
foo
返回类型为的值:


除FUNCALL之外的另一个选项是APPLY:

(应用(foo)无)


FUNCALL是这里的惯用方法,但是当您有一个参数列表时,您需要应用它。

这里的相关术语是“Lisp-1”和“Lisp-2”

您尝试调用将在Lisp-1中工作,例如Scheme或Clojure。 Common Lisp是一个Lisp-2,但这大致意味着变量名和函数名是分开的

因此,为了调用绑定到变量的函数,您需要使用其他人指出的特殊形式
funcall
apply
,或者设置符号
foo
的函数值,而不是变量值

前者基本上取符号的变量值,假设/检查该值是一个函数,然后调用该函数(使用传递给
funcall
/
apply
的任何参数)

你并不真的想做后者,因为除了非常专业的情况外,这在所有情况下都是非常愚蠢的,但为了完整起见,这大致就是你要做的:

CL-USER> (setf (symbol-function 'foo) (lambda () 42))
#<FUNCTION (LAMBDA ()) {C43DCFD}>
CL-USER> (foo)
42
i、 e.在此,您临时将符号
foo
的函数值绑定到返回42的函数。在该临时上下文中,您可以像常规全局函数一样调用
(foo)

CL-USER> (setf (symbol-function 'foo) (lambda () 42))
#<FUNCTION (LAMBDA ()) {C43DCFD}>
CL-USER> (foo)
42
(flet ((foo () 
         42))
  (foo))