Метациклический оценщик - PullRequest
1 голос
/ 16 февраля 2011

Я должен написать схему со схемой .. тихо смешно, но это ситуация.В любом случае, вот пример для того, чтобы попытаться написать выражение «лямбда» со всеми обработчиками, которые я могу использовать, и мне также нужна помощь в написании выражения «Позвольте».Как я могу перевести выражение «Let» в лямбду, используя аналогичный способ?Спасибо.

    (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 Ответ

3 голосов
/ 15 мая 2011

Вам просто нужно написать программу, которая будет преобразовывать.

(let ((e1 v1) (e2 v2) ...) body ..) => ((лямбда (e1 e2)...) body ..) v1 v2 ...)

И ознакомьтесь с главой 4 SICP.

...