Lesson Plan - 6.001 SP04 - recitation 12 ADTs - tables truth tables lookup (define (lookup t1 t2 lookup-table) (second (assoc (list t1 t2) lookup-table))) (define and-table '(((#t #t) #t) ((#t #f) #f) ((#f #t) #f) ((#f #f) #f))) (define or-table '(((#t #t) #t) ((#t #f) #t) ((#f #t) #t) ((#f #f) #f))) (define nand-table '(((#t #t) #f) ((#t #f) #t) ((#f #t) #t) ((#f #f) #t))) (lookup #t #f nand-table) ; component (define (make-component lookup-table) (let ((num (get-counter)) (table (make-eq-hash-table))) (hash-table/put! table 'lookup-table lookup-table) (component-table-put! num table) (inc-counter) num)) (define (component-get num property) (hash-table/get (component-table-get num) property 'empty)) (define (component-connect! cnum1 cnum2 side) (let ((c1table (component-table-get cnum1))) (hash-table/put! c1table 'output cnum2) (hash-table/put! c1table 'output-side side) 'connected)) (define (component-output! cnum) (hash-table/put! (component-table-get cnum) 'output 'output) (hash-table/put! (component-table-get cnum) 'output-side 'output) 'will-output) (define (component-output-data num data) (let ((output (component-output-num num)) (output-side (component-output-side num))) (cond ((or (eq? output 'empty) (eq? output-side 'empty)) (error "unconnected component output" num)) ((eq? output 'output) (display "Result: ") (display data) (newline) #t) (else (hash-table/put! (component-table-get output) output-side data) #f)))) (define (component-process num) (let ((inp1 (component-input1 num)) (inp2 (component-input2 num))) (if (or (eq? inp1 'empty) (eq? inp2 'empty)) #f (component-output-data num (lookup inp1 inp2 (component-lookup-table num)))))) (define (simulate) (let ((results (map component-process (component-table-keys)))) (if (fold-right boolean/or #f results) 'simulation-complete (simulate))))