要实现
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)