(class Stack Object (elems) (define initStack () (begin (set elems (mkList)) self)) (define push: (x) (add: elems x)) (define pop () (removeFirst elems)) (define top () (car elems)) (define isEmpty () (isEmpty elems)) (define print () (begin (print #Stack) (printAux self (first elems)))) (define printAux (e) (begin (while (notNil e) (begin (print e) (set e (next elems)))) self)) ) (define mkStack () (initStack (new Stack))) (set myStack (mkStack)) (class SizedStack Stack (size) (define initSizedStack () (begin (initStack self) (set size 0) self)) (define size () size) (define push: (x) (begin (set size (+ 1 size)) (add: elems x))) (define pop () (begin (set size (- 1 size)) (removeFirst elems))) ) (define mkSizedStack () (initSizedStack (new SizedStack))) (set sStack (mkSizedStack)) Steps in message sending: let receiver = object that is sent message let c = class of receiver 1. [fetch] look for method in class c found: go to step 2 not found: if c is Object give error, else goto 1. 2. [call] bind formals to actuals and execute the code of the method (define assignMyStack (b) (if b (set myStack (mkStack)) (set myStack (mkSizedStack)))) (push: myStack 4) Smalltalk CLU (xCord yCord) (rep xCord yCord) (set xCord x) (set-xCord p x) xCord (xCord p) self p (define rotate () (define rotate (p) ... self...) ...p ...) (class CachedStack Stack (cache) (define initCachedStack () (begin (initStack self) (set cache #nil) self)) (define push: (anElem) (if (notNil cache) (begin (add: elems cache) (set cache anElem)) (set cache anElem))) (define pop () (if (isNil cache) (removeFirst elems) (set cache #nil))) (define top () (if (notNil cache) cache (car elems))) (define isEmpty () (and (isNil cache) (isEmpty elems))) (define print () (begin (print #Stack) (if (notNil cache) (print cache) 0) (printAux self (first elems)))) ) (define mkCachedStack () (initCachedStack (new CachedStack)))