(load "ub10-3a.scm") ;;; SIGNATUR ;;; make-traffic-light: string -> traffic-light ;;; ERKLÄRUNG ;;; Konstruktorfunktion für Objekte der Klasse traffic-light. Das Argument ist ;;; der Name der Ampel. Jede Ampel hat fünf verschiedene Zustände. Aus, rot, ;;; rot-gelb, grün und gelb. ;;; Die Klasse kennt folgende Methoden: ;;; step: -> VOID ;;; (send t 'step) führt dazu, daß die Ampel in den nächsten Zustand übergeht. ;;; Falls die Ampel im Zustand aus ist, wird eine Fehlermeldung ausgegeben. ;;; (send t 'reset) setzt die Ampel in den Zustand rot. ;;; DEFINITION (define make-traffic-light (lambda (name) (let ((red (make-bulb "rot")) (yellow (make-bulb "gelb")) (green (make-bulb "grün")) (state 0)) (lambda (message) (case message ((step) (lambda (this) (if (= state 0) (begin (display name) (display " ist ausgeschaltet!") (newline)) (begin (display "Schaltvorgänge bei ") (display name) (display ":") (newline) (case state ((1) (send yellow 'turn-on)) ((2) (send red 'turn-off) (send yellow 'turn-off) (send green 'turn-on)) ((3) (send green 'turn-off) (send yellow 'turn-on)) ((4) (send yellow 'turn-off) (send red 'turn-on))) (set! state (if (= state 4) 1 (add1 state))))))) ((reset) (lambda (this) (display name) (display " wird initialisiert") (newline) (case state ((0) (send red 'turn-on)) ((1) #f) ((2) (send yellow 'turn-off)) ((3) (send green 'turn-off) (send red 'turn-on)) ((4) (send yellow 'turn-off) (send red 'turn-on))) (set! state 1))) (else (make-no-method 'traffic-light message)))))))