为什么没有将函数值传递给lambda函数并进行评估?

时间:2017-03-03 03:57:58

标签: lambda lisp

所以我试图构建一个可以处理用户定义的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)并输入(square 4)时,我试着这样做:

16

关于我遗失的任何指导?

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

  

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

示例:

    String dest = ts.getScreenshotAs(OutputType.BASE64);

    return "data:image/jpg;base64, " + dest ;

答案 2 :(得分:0)

创建不依赖主机evalcoerce)的解释器时,将lambda与当前环境一起存储为数据。您的apply需要支持根据存储的环境创建一个绑定到其名称的参数的新框架。然后需要在该环境下评估身体。因此,您从不使用Common Lisp lambda宏而不是apply来进行复合应用。

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