"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)))
我正在用 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)))