"让"在球拍Matacircular评估员

时间:2015-01-30 03:11:04

标签: scheme racket interpreter

我正在为Racket编写一个metacircular评估器,我在为let表达式创建语法抽象时遇到了麻烦。我正在尝试为let的主体创建代码,基本上是(expand-let '(((a 1) (b 2)) (+ a b))) 应该产生'((lambda (a b) (+ a b)) 1 2)

我知道我需要通过绑定来递归,直到达到表达式(+ ab),但我不清楚如何在Racket中询问列表的车是+, - ,*等< / p>

任何建议都将不胜感激。

2 个答案:

答案 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

希望有所帮助。