From d217ffbca7a50c434cb0db1541dfbc667e2b8a48 Mon Sep 17 00:00:00 2001 From: Akshay Date: Fri, 6 Nov 2020 08:31:27 +0530 Subject: add evaluators for let* forms --- main.scm | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/main.scm b/main.scm index 7476efb..dd60662 100644 --- a/main.scm +++ b/main.scm @@ -91,14 +91,26 @@ ;;; let (define (let-form? expr) (tagged? expr 'let)) +(define (let*-form? expr) (tagged? expr 'let*)) (define (let-bindings expr) (cadr expr)) +(define (last-binding? bindings) (null? (cdr bindings))) (define (let-body expr) (cddr expr)) (define (let-binding-variables bindings) (map car bindings)) (define (let-binding-values bindings) (map cadr bindings)) +(define (make-let bindings body) (list 'let bindings body)) +(define (make-let* bindings body) (list 'let* bindings body)) (define (let->lambda expr) (let ([bindings (let-bindings expr)]) (make-lambda (let-binding-variables bindings) (let-body expr)))) +(define (let*->let expr) + (let ([bindings (let-bindings expr)] + [body (sequence->expr (let-body expr))]) + (cond + [(last-binding? bindings) (make-let bindings body)] + [else (make-let (list (car bindings)) + (let*->let (make-let* (cdr bindings) body)))]))) + (define (eval-expr expr env) (cond @@ -109,6 +121,7 @@ [(lambda-form? expr) (make-lambda (lambda-params expr) (lambda-body expr))] [(let-form? expr) (eval-let expr env)] + [(let*-form? expr) (eval-let* expr env)] [(assignment? expr) (eval-assignment expr env)] [(definition? expr) (eval-definition expr env)] [(cond-form? expr) (eval-cond expr env)] @@ -131,9 +144,13 @@ (eval-sequence (cdr exprs) env))])) (define (eval-let expr env) - (eval-function-application (cons (let->lambda expr) - (let-binding-values (let-bindings expr))) - env)) + (eval-function-application + (cons (let->lambda expr) + (let-binding-values (let-bindings expr))) + env)) + +(define (eval-let* expr env) + (eval-expr (let*->let expr) env)) (define (eval-assignment expr env) (set-variable-value! -- cgit v1.2.3