53 lines
1.4 KiB
Scheme
53 lines
1.4 KiB
Scheme
|
|
;; The digital circuit program is very interesting,
|
|
;; not just because it is a good demonstration of scheme,
|
|
;; but also because I really think this is a practical
|
|
;; program.
|
|
|
|
;; anyway, here are the exercises
|
|
|
|
;; so, the book does not provide an implementation for make-wire,
|
|
;; get-signal, set-signal!, add-action! and after-delay
|
|
;; so if we want this code to run, we need to implement them.
|
|
|
|
;; I chose to use a closure for this, because this is something
|
|
;; I really learned with SICP so may as well. We could also use
|
|
;; a box (in r6rs I believe, or at least chez)
|
|
;; and in all fairness I believe that is more efficient, however this was funny
|
|
|
|
;; EDIT: later on in the chapter the book actually provides a similar implementation
|
|
;; so I guess I'm prescient now
|
|
(define (make-wire)
|
|
(let ((val #f) (actions '()))
|
|
(lambda (x param)
|
|
(cond
|
|
((eq? x 'get) val)
|
|
((eq? x 'set!)
|
|
(if (not (boolean=? val param))
|
|
(begin (set! val param)
|
|
(map (lambda (x) (x))
|
|
actions))))
|
|
((eq? x 'add-action!)
|
|
(set! actions (cons param actions))
|
|
(param))))))
|
|
|
|
(define (get-signal w)
|
|
(w 'get 'USELESS))
|
|
(define (set-signal! w val)
|
|
(w 'set! val))
|
|
(define (add-action! w action)
|
|
(w 'add-action! action))
|
|
|
|
|
|
(define a (make-wire))
|
|
(define b (make-wire))
|
|
(define c (make-wire))
|
|
(define d (make-wire))
|
|
(define e (make-wire))
|
|
(define s (make-wire))
|
|
|
|
|
|
|
|
|
|
|