所以我试图构建一个可以处理用户定义的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列表抱怨它不是一个符号,任何想法为什么会这样?
答案 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)
创建不依赖主机eval
(coerce
)的解释器时,将lambda与当前环境一起存储为数据。您的apply
需要支持根据存储的环境创建一个绑定到其名称的参数的新框架。然后需要在该环境下评估身体。因此,您从不使用Common Lisp lambda
宏而不是apply
来进行复合应用。
建议使用coerce
的其他答案不适用于解释器中的词法变量。