Exercise: Oski M. Wizard can't wait to implement his own Scheme evaluator (which we'll do in week 12), so he decides to write a highly simplified one using data-directed programming. Oski's Scheme evaluator only handles special forms, primitive procedures, and global variables. (define (simp-eval exp) (cond ((self-evaluating? exp) exp) ((variable? exp) (get exp 'bindings)) (else (let ((operator (car exp)) (args (cdr exp)) ) (let ((special (get operator 'special-forms))) (if special (apply special args) (apply (simp-eval operator) (map simp-eval args)) )))) )) (define (self-evaluating? exp) (or (number? exp) (boolean? exp)) ) (define variable? symbol?) To use his evaluator, Oski would type in: > (simp-eval '(define a (+ 5 13)) ) > (simp-eval 'a) 18 > (simp-eval '(define b (* 3 6)) ) > (simp-eval 'b) 18 > (simp-eval '(if (= a b) 1 0) ) 1 Help Oski finish his evaluator by adding appropriate procedures to handle DEFINE, IF, +, *, and =. Complete the following expressions: (put 'define ) (put 'if ) (put '+ ) (put '* ) (put '= )