From 57edb75ca639bcc6bdc5838ac6b4beb72a5b7512 Mon Sep 17 00:00:00 2001 From: Akshay Date: Thu, 5 Nov 2020 17:31:11 +0530 Subject: evaluate cond forms, by forming if else chain --- main.scm | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/main.scm b/main.scm index 59dae1d..8db3289 100644 --- a/main.scm +++ b/main.scm @@ -20,6 +20,8 @@ (define variable? symbol?) ;;; if-else +(define (make-if predicate consequent alternative) + (list 'if predicate consequent alternative)) (define (if-else? expr) (tagged? expr 'if)) (define (if-predicate expr) (cadr expr)) (define (if-consequent expr) (caddr expr)) @@ -28,6 +30,26 @@ (cadddr expr) 'false)) +;;; cond forms +(define (cond-form? expr) (tagged? expr 'cond)) +(define (cond-clauses expr) (cdr expr)) +(define (cond-predicate clause) (car clause)) +(define (cond-consequent clause) (cadr clause)) +(define (cond-else? clause) (tagged? clause 'else)) +(define (last-clause? clauses) (null? (cdr clauses))) +(define (make-cond clauses) (cons 'cond clauses)) +(define (cond->if expr) + (let ([clauses (cond-clauses expr)]) + (cond + [(cond-else? (car clauses)) (cond-consequent (car clauses))] + [(last-clause? clauses) (make-if (cond-predicate (car clauses)) + (cond-consequent (car clauses)) + '())] + [else (make-if (cond-predicate (car clauses)) + (cond-consequent (car clauses)) + (cond->if (make-cond (cdr clauses))))]))) + + ;;; function application (define (function-application? expr) (pair? expr)) (define (operator expr) (car expr)) @@ -47,6 +69,7 @@ (cond [(self-evaluating? expr) expr] [(if-else? expr) (eval-if expr env)] + [(cond-form? expr) (eval-cond expr env)] [(quote-form? expr) (quotation-text expr)] [(function-application? expr) (apply-expr (operator expr) @@ -57,6 +80,9 @@ (eval-expr (if-consequent expr) env) (eval-expr (if-alternative expr) env))) +(define (eval-cond expr env) + (eval-expr (cond->if expr) env)) + (define (primitive? proc) (is-elem-assoc-list proc primitives)) -- cgit v1.2.3