Lesson Plan - 6.001 SP04 - recitation 15 objects I procedures with state reinforce environment diagrams message passing logistics: - project 4 out - do something cool (1/3 pts for the project) - lots of code to read; don't have to read and understand it all at the beginning caveat: - objects used in todays discussion don't apply to the project! problems assq = (association-procedure eq? car) (define (make-stack) (let ((vals '())) (lambda (message) (case message ((EMPTY?) (null? vals)) ((CLEAR) (set! vals '()) 'cleared) ((PEEK) (if (null? vals) (error "stack underflow") (car vals))) ((PUSH) (lambda (val) (set! vals (cons val vals)) 'pushed)) ((POP) (if (null? vals) (error "stack underflow") (let ((oldval (car vals))) (set! vals (cdr vals)) oldval))) (else (error "stack can't" message)))))) (define (push-all stack lst) (for-each (stack 'PUSH) lst) stack) (define (pop-all stack) (if (stack 'EMPTY?) '() (let ((val (stack 'POP))) (cons val (pop-all stack))))) (define s (make-stack)) ((s 'PUSH) 1) ((s 'PUSH) 2) ((s 'PUSH) 3) (pop-all s) (define (reverse lst) (pop-all (push-all (make-stack) lst))) (reverse '(1 2 3)) (define (make-calculator) (let ((stack (make-stack)) (ops (list (make-binary-operation '+ +) (make-binary-operation '- -) (make-binary-operation '* *) (make-binary-operation '/ /))) (oplookup (association-procedure eq? (lambda (x) (x 'NAME))))) (lambda (message) (case message ((NUMBER-INPUT) (lambda (num) ((stack 'PUSH) num))) ((OPERATION-INPUT) (lambda (opname) (let* ((op (oplookup opname ops)) (val1 (stack 'POP)) (val2 (stack 'POP))) ((stack 'PUSH) ((op 'OPERATE) val2 val1))))) ((CLEAR) (stack 'CLEAR)) ((ANSWER) (if (stack 'EMPTY?) 'empty-stack (stack 'PEEK))) (else (error "calculator can't" message))))))