我正在计划中的计划评估员。我需要实现let,我已经解析,以便我有变量名,输入值和函数体。我需要使用解析的信息返回lambda函数,因此我有以下代码:
(define (eval-let exp env)
((lambda (let-variables (let-bindings exp)) (let-body exp)) (let-exp (let-bindings exp))))
(let-variables(let-bindings exp))计算变量名列表(例如:'(x y)),所以我基本上对此进行评估:
((lambda '(x y) (* x y)) '(2 3))
方案解释器简单说:#%plain-lambda:不是以下的标识符:( let-bindings exp)我猜是因为它需要一组标识符,而不是值列表。
如何将我的值列表转换为一组标识符?
答案 0 :(得分:1)
要在您自己的解释器中实现let
表达式,首先必须将其转换为lambda
应用程序,类似于此(程序名称应该是不言自明的):
(define (let->combination exp)
(let* ((bindings (let-bindings exp))
(body (let-body exp))
(exps (bindings-all-exps bindings))
(lambda (make-lambda (bindings-all-vars bindings) body)))
(make-application lambda exps)))
(define (make-lambda parameters body)
(list* 'lambda parameters body))
(define (make-application proc . args)
(cond ((null? args) (list proc))
((list? (car args)) (cons proc (car args)))
(else (cons proc args))))
在语法转换完成后,您可以继续评估它:
(eval (let->combination exp) env)
我想指出的是,您不应该尝试直接评估它。另外要小心,你生成的代码有几个不正确的引号:
((lambda '(x y) (* x y)) '(2 3))
^ ^
here here
它应该是这样的:
((lambda (x y) (* x y)) 2 3)