#lang racket (define make-stack (lambda () (let ([stk '()]) (lambda (msg . args) (case msg [(empty?) (null? stk)] [(push) (set! stk (cons (car args) stk))] [(pop) (if (not (null? stk)) (let ([top (car stk)]) (set! stk (cdr stk)) top) (error "stack is empty"))] [else (error 'stack "illegal message to stack object: ~a" msg)]))))) (define lazy_evaluation (lambda (t) (let ([val #f] [flag #f]) (lambda () (if (not flag) (begin (set! val (t)) (set! flag #t) (write "Yoohoo") val) val))))) ; (define foo (lazy_evaluation (lambda () 3))) (define make-counter (let ([supply 5]) (lambda () (let ([num 0]) (lambda () (if (zero? supply) 'supply_empty (begin (set! num (add1 num)) (set! supply (sub1 supply)) (list supply num)))))))) ; (define wc1 (make-counter)) ; (define wc2 (make-counter))