;; The first three lines of this file were inserted by DrRacket. They record metadata ;; about the language level of this file in a form that our tools can easily process. #reader(lib "htdp-intermediate-lambda-reader.ss" "lang")((modname mini-dr) (read-case-sensitive #t) (teachpacks ()) (htdp-settings #(#t constructor repeating-decimal #f #t none #f ()))) (require htdp/gui) (require "string.rkt") ;; An expr is either ;; - num ;; - (list '+ expr expr) ;; - (list '- expr expr) ;; eval-expr : expr -> num ;(define (eval-expr x) ; (cond ; [(number? x) ... x ...] ; [(symbol=? '+ (first x)) ... (eval-expr (second x)) ... (eval-expr (third x)) ...] ; [(symbol=? '- (first x)) ... (eval-expr (second x)) .... (eval-expr (third x)) ...])) (define (eval-expr x) (cond [(number? x) x] [(symbol=? '+ (first x)) (+ (eval-expr (second x)) (eval-expr (third x)))] [(symbol=? '- (first x)) (- (eval-expr (second x)) (eval-expr (third x)))])) (check-expect (eval-expr 4) 4) (check-expect (eval-expr '(- 9 8)) 1) (check-expect (eval-expr '(+ (- 9 1) (- 8 2))) 14) ;; ---------------------------------------- (define (read-eval-print evt) (draw-message result-msg (to-string (eval-expr (from-string (text-contents expr-field)))))) (define expr-field (make-text "Expr:")) (define eval-button (make-button "Evaluate" read-eval-print)) (define result-msg (make-message "__________________________")) ;; Like `big-bang' --- so don't include it in ;; handin! (create-window (list (list expr-field) (list eval-button) (list result-msg)))