在scheme中解释lambda时出错

在scheme中解释lambda时出错,lambda,scheme,interpreter,Lambda,Scheme,Interpreter,我试图在scheme中解释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 --&g

我试图在scheme中解释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)(+n2))5)
时,我得到一个错误,表示“作为参数传递给
安全车的对象
()
,不是一对”。为什么会这样?。我确信
lambda stmt?
函数运行良好,因此我没有在这里编写它,对
apply lambda
的解释有问题,但我找不到它。

这似乎是错误的:

(lambda-stmt? e)
应该是:

(lambda-stmt? (car e))

解释
lambda
本身并不重要

(define (make-closure formals body env)
  `(CLOSURE ,formals ,body ,env))
(define closure-formals cadr)
(define closure-body    caddr)
(define closure-env     cadddr)

(define (procedure? thing)
  (and (pair? thing) (eq? 'CLOSURE (car thing))))
然后在口译员中:

((lambda-stmt? e) (make-closure (cadr e) (caddr) env))
然后,您必须更改函数/运算符(您的'else'子句)的应用程序来处理过程(除了数学运算)。而且,调用时需要将过程应用于其参数-但这与
let
非常相似(将
lambda
形式绑定到参数,在新环境中解释
lambda
主体)

[添加…]

我开始这样想:

(define (make-primitive name)
  `(PRIMITIVE ,name))
(define primitive-name cadr)
(define (primitive? thing)
  (and (pair? thing) (eq? 'PRIMITIVE (car thing))))

(define top-level-env
  (map (lambda (op) (cons op (make-primitive op))) '(+ - * /)))

(define (interpret e env)
  (cond ((number? e) ...)
        ((symbol? e) ...)
        ((null?   e) (error "interpreter: cannot evaluate --> " e))
        ((if-stmt? e) ...)
        ;; other syntax (let, lambda, set!, ...)
        ...
        ;; function call
        ((list?   e)
         (let ((ie (map (lambda (e) (interpret e env)) e)
           (let ((operator (car ie))
                 (operands (cdr ie)))
             (cond ((primitive? operator)
                    (let ((function (get-operator (primitive-name operator))))
                      (apply function operands)))
                   ((procedure? operator)
                    ...)
                    (else 'error)))))
       (else 'error)))

谢谢,我修复了它,但是现在我得到一个错误,说“对象(),作为参数传递给safe car的不是一对”。为什么会这样?谢谢这取决于你使用的方案解释器,检查文档你能把上面的代码编辑成“;”;;GoZoner的代码“紧跟在(让stmt?e)”之后,您对lambda的唯一使用是函数调用吗?或者您希望处理类似于
(let((func(lambda…))(func…)
我正在尝试实现->(lambda()),->NUMBER | IDENT | | | | | | | | |,->(let()),->(IDENT)|(IDENT)),->(IDENT)|IDENT |IDENT@GoZoner因此,它似乎只是一个函数调用,并不真正需要(let((func(lambda…)(func…)你最好澄清一下。看起来
lambda
是一个
(就像在实际方案中一样)。到目前为止,你只在函数调用位置使用了运算符(比如
(+12)
)。现在你可以直接使用
lambda
或其他返回
lambda
的表达式。谢谢,但当我尝试输入时((lambda(n)(+n2))5)我仍然得到相同的错误,即“s6解释:运算符未实现-->(lambda(n)(+n2))。为什么仍然发生这种情况?因为在最后的
else
子句中,您调用的是
get运算符
。该调用仅在函数是基本运算符时才起作用(比如
+
或者
*
)。只要你引入
lambda
,你就会接到
(foo 1 2)
这样的电话,其中
foo
绑定到
lambda
[这就是为什么我在回答中说“你必须改变…”