"let" 在 Racket Matacircular Evaluator 中

"let" in Racket Matacircular Evaluator

我正在用 Racket 编写元循环求值器,但在为 let 表达式创建句法抽象时遇到了问题。我正在尝试为 let 的主体创建代码,所以本质上,(expand-let '(((a 1) (b 2)) (+ a b))) 应该产生 '((lambda (a b) (+ a b)) 1 2)

我知道我需要通过绑定递归直到达到表达式 (+ a b),但我不清楚如何在 Racket 中询问列表的汽车是否为 +、-、* 等.

如有任何建议,我们将不胜感激。

如果列表的 car+-* 等,则无需询问 Racket。expand-lambda函数可以定义如下:

(define (expand-lambda expr)
    (let* ((pairs (car expr))
           (body  (cdr expr))
           (keys  (map car pairs))
           (vals  (map cadr pairs)))
    (cons (cons 'lambda (cons keys body)) vals)))

希望对您有所帮助。

我觉得你想多了。这是我对 expand-let:

的实现
(define (expand-let form)
  (define bindings (car form))
  `((lambda ,(map car bindings) ,@(cdr form))
    ,@(map cadr bindings)))