我正在为Racket编写一个metacircular评估器,我在为let表达式创建语法抽象时遇到了麻烦。我正在尝试为let的主体创建代码,基本上是(expand-let '(((a 1) (b 2)) (+ a b)))
应该产生'((lambda (a b) (+ a b)) 1 2)
我知道我需要通过绑定来递归,直到达到表达式(+ ab),但我不清楚如何在Racket中询问列表的车是+, - ,*等< / p>
任何建议都将不胜感激。
答案 0 :(得分:3)
我认为你过度思考它。这是expand-let
的实现:
(define (expand-let form)
(define bindings (car form))
`((lambda ,(map car bindings) ,@(cdr form))
,@(map cadr bindings)))
答案 1 :(得分:2)
如果列表的car
是+
,-
,*
等,您不需要询问Racket。{{1}函数可以定义如下:
expand-lambda
希望有所帮助。