metacircular评估员

时间:2011-02-16 09:32:28

标签: scheme interpreter metacircular

我必须用计划编写计划..安静有趣,但那就是情况。 无论如何,这是一个尝试用我可能使用的所有proucedor写“lambda”表达式的例子,我也需要帮助写“Let”表达式。如何使用类似的方式将“Let”表达式翻译成lambda? 感谢。

    (define (lambda? exp) (tag-check exp 'lambda))
 
(define (eval exp env)
  (cond  ((number? exp)       exp)
         ((symbol? exp)      (lookup exp env))
         ((define? exp)      (eval-define exp env))  
         ((if? exp)          (eval-if exp env))
         ((lambda? exp)      (eval-lambda exp env))
         ((application? exp) (apply (eval (car exp) env)
                                 (map (lambda (e) (eval e env))
                                         (cdr exp))))
         (else (error "unknown expression " exp))))
 
(define (eval-lambda exp env) 
      (make-procedure (lambda-parameters exp)
                         (lambda-body exp)
                         env))

(define (lambda-parameters exp) (cadr exp))
(define (lambda-body exp) (cddr exp))

(define (make-procedure parameters body env)
  (list 'procedure parameters body env))

1 个答案:

答案 0 :(得分:3)

你只需要编写一个可以转换的程序。

  

(let((e1 v1)(e2 v2)...)body ..)=> ((lambda(e1 e2 ...)body ..)v1 v2 ...)

查看SICP第4章。