【发布时间】:2013-05-24 00:28:47
【问题描述】:
我正在尝试在方案中解释 lambda。这是我的代码:
(define get-operator (lambda (op-symbol)
(cond
((equal? op-symbol '+) +)
((equal? op-symbol '-) -)
((equal? op-symbol '*) *)
((equal? op-symbol '/) /)
(else (error "interpret: operator not implemented -->" op-symbol)))))
(define (apply-lambda clos actuals)
(let* ((lam (cadr clos))
(def-env (caddr clos))
(formals (cadr lam))
(body (caddr lam))
(new-env (bind-all formals actuals def-env)))
(val-body new-env)))
(define interpret (lambda (e env)
(cond
((number? e) e)
((symbol? e) (get-value e env))
((not (list? e)) (error "interpret: cannot evaluate -->" e))
((if-stmt? e) (if (eq? (cadr e) 0)
(interpret (cadddr e) env)
(interpret (caddr e) env)))
((let-stmt? e) ;;GoZoner's part of code
(let ((names (map car (cadr e)))
(inits (map cadr (cadr e))))
;; Evaluate inits in env
(let ((vals (map (lambda (init) (interpret init env)) inits)))
;; Extend env with names+vals
(let ((new-env (append (map cons names vals) env)))
;; Eval body in new env
(interpret (caddr e) new-env)))))
((lambda-stmt? e) (apply-lambda e env))
(else
(let ((operands (map interpret (cdr e) (make-list (length (cdr e)) env)))
(operator (get-operator (car e))))
(apply operator operands))))))
当我尝试输入 ((lambda (n) (+ n 2)) 5) 时,我收到一条错误消息,提示“对象 (),作为参数传递给 safe-car 不是一对”。为什么会这样?我确定lambda-stmt?函数运行良好所以我没有在这里写,apply-lambda的解释有问题但我找不到它。
【问题讨论】:
-
你可以编辑上面的代码说';;
(let-stmt? e)之后的 GoZoner 代码? -
您对
lambda的唯一用途是函数调用吗?或者您是否希望处理类似(let ((func (lambda ...))) (func ...)) -
我正在尝试实现
-> ( lambda ( ) ) , -> NUMBER |标识 | | | | | , -> ( let ( ) ) , -> ( IDENT ) | ( IDENT ) , -> IDENT |标识 -
@GoZoner 所以它看起来只是一个函数调用,并不真正需要 (let ((func (lambda ...))) (func ...))
-
你最好澄清一下。看起来
lambda是一个<expr>(因为它在真实的 Scheme 中)。到目前为止,您只有在函数调用位置的运算符(如(+ 1 2))。现在你可能有lambda直接或其他返回lambda的表达式。
标签: lambda scheme interpreter