2017-03-03 65 views
0

所以我试图构造一个解释器,可以处理用户定义的lambda函数,其中可以有可变数量的参数。代码看起来有点像这样:为什么不将函数值传递给lambda函数并进行评估?

((lambda (x &optional y z) (func_body)) args)) 

眼下,结果我可以是没有它被评估的正常功能;例如,如果我定义square X = (* X X)和运行我的解释,我得到:

(* X X) 

我需要被评估后的上述功能。我已经尝试了诸如:

(let ((func (lambda (x &optional y z) (func_body)))) 
    (apply/funcall func args)) 

((lambda (x &optional y z) (func_body)) args) 

但是他们仍然产生结果,我以后我不是。我想拥有它,所以当我定义square X = (* X X),并把在​​我得到:

16 

对我缺少了任何指导?

编辑:args子句由(cdr/car Y)或其他函数生成。另外,如果我尝试使用函数lisp生成lambda列表,抱怨它不是一个符号,为什么会这样呢?

回答

0

我看到的唯一错误的let语法:应该是

(let ((func (lambda (x) (* x x)))) 
    (funcall func 4)) 
==> 16 

Lambda也可以工作:

((lambda (x) (* x x)) 5) 
==> 25 

现在,如果你的身体是存储在variable,稍微变更人为的:

(defparameter *square* '(* x x)) 
(funcall (coerce `(lambda (x) ,*square*) 'function) 3) 
==> 9 

但是,它会是一个更好的主意,让你的代码从一个lambda开始走:

(defparameter *square* (lambda (x) (* x x))) 
(funcall *square* 4) 
==> 16 
+0

我应该提到args子句是由(cdr/car Y)或其他函数生成的。大部分的lambda函数现在都是我想到的。基本上,命令行读取的东西类似于 '>'square X =(* X X)'square 4' result:'> 16' – KMK

+0

使用'coerce',请参阅编辑。 – sds

+0

非常感谢! – KMK

0

((拉姆达(X &可选YZ)(func_body))参数)

例子:

CL-USER 111 > ((lambda (x &optional (y 0) (z 0)) 
       (+ x y z)) 
       1 
       2 
       3) 
6 

CL-USER 112 > (apply (lambda (x &optional (y 0) (z 0)) 
         (+ x y z)) 
        '(1 2 3)) 
6 
0

当创建一个解释,你不依赖主机evalcoerce):根据您存储与CURREN拉姆达t环境作为数据。您的apply需要支持使用基于存储环境的名称绑定参数来创建新框架。那么身体需要在该环境下进行评估。因此,您从未使用Common Lisp lambda宏而不是apply作为复合应用程序。

建议使用coerce的其他答案将不适用于解释器中的词汇变量。

相关问题