;; GOAL: create a counter class using ;; regular Scheme ;;;;;;;;;;;;;;;;;; ;; Step1: instance variable (define make-counter (lambda () (let ((num 1)) (lambda () (set! num (+ num 1)) num)))) ;;;;;;;;;;;;;;;;;; ;; Step2: class variable (define make-counter (let ((total-num 0)) (lambda () (let ((num 1)) (lambda () (set! total-num (+ total-num 1)) (set! num (+ num 1)) num))))) ;;;;;;;;;;;;;;;;;; ;; Step3: accepting message (define make-counter (let ((total-num 0)) (lambda () (let ((num 1)) (define (dispatch m) (cond ((eq? m 'count) (set! total-num (+ total-num 1)) (set! num (+ num 1)) num)) (else 'unknown-message))) dispatch))) ;;;;;;;;;;;;;;;;; ;; Step4: method (define make-counter (let ((total-num 0)) (lambda () (let ((num 1)) (define (increase n) (set! num (+ num n)) num) (define (count) (set! num (+ num 1)) (set! total-num (+ total-num 1)) num) (define (dispatch m) (cond ((eq? m 'count) count) ((eq? m 'increase) increase) (else 'unknown-message))) dispatch) )))