DOESN'T WORK YET
; counter-maker1.scm -
; - Program 12.7, pg. 391 -
(define for-effect-only
(lambda (item-ignored)
"unspecified value"))
(define base-object
(lambda msg
(case (1st msg)
((type) "base-object")
(else invalid-method-name-indicator))))
(define box-maker
(lambda (init-value)
(let ((cell (cons init-value "any value")))
(lambda msg
(case (1st msg)
((type) "box")
((update!) (for-effect-only (set-car! cell (2nd msg))))
((swap!) (let ((ans (car cell)))
(set-car! cell (2nd msg))
ans))
((show) (car cell))
((reset!) (for-effect-only (set-car! cell init-value)))
(else (delegate base-object msg)))))))
(define counter-maker
(lambda (init-value unary-proc)
(let ((total (box-maker init-value)))
(lambda msg
(case (1st msg)
((type) "counter")
((update!) (let ((result (unary-proc (send total 'show))))
(send total 'update! result)))
((swap!) (delegate base-object msg))
(else (delegate total msg)))))))
(define send
(lambda (args)
(let ((object (car args)) (message (cdr args)))
(let ((try (apply object message)))
(if (eq? invalid-method-name-indicator try)
(error
(string-append (symbol->string (car message)) ": "
"Bad method name sent to object of "
(object 'type) " type."))
try)))))
Text file Source (historic): geocities.com/soho/square/3472
geocities.com/soho/squaregeocities.com/soho
(to report bad content: archivehelp @ gmail)
|
|
|
|
|