;; Die ersten drei Zeilen dieser Datei wurden von DrRacket eingefügt. Sie enthalten Metadaten ;; über die Sprachebene dieser Datei in einer Form, die DrRacket verarbeiten kann. #reader(lib "DMdA-assignments-reader.ss" "deinprogramm")((modname concurrent-account) (read-case-sensitive #f) (teachpacks ()) (deinprogramm-settings #(#f write repeating-decimal #t #t none explicit #f ()))) (define balance 130) ; Erzeuge Semaphor: (define s (make-semaphore)) (define withdraw (lambda (amount) (begin (P s) (if (>= balance amount) (begin (set! balance (- balance amount)) balance) (violation "No money")) (V s)))) (: make-account (natural -> (account-message -> (natural -> natural)))) (define make-account (lambda (init-amount) (letrec ((balance init-amount) (s (make-semphaore)) ; Semaphore für dieses Konto (withdraw (lambda (amount) (begin (P s) (if (>= balance amount) (begin (set! balance (- balance amount)) balance) (violation "No money!")) (V s)))) (deposit (lambda (amount) (begin (set! balance (+ balance amount)) balance))) (dispatch (lambda (message) (cond ((string=? message "withdraw") withdraw) ((string=? message "deposit" ) deposit))))) dispatch))) ; Überweisung von einem Konto auf ein anderes (define transfer (lambda (a1 a2 s1 s2) ; Konten und ihre Semaphore (begin (P s1) (P s2) (...Überweisung von a1 auf a2...) (V s1) (V s2))))