;; 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 account) (read-case-sensitive #f) (teachpacks ()) (deinprogramm-settings #(#f write repeating-decimal #t #t none explicit #f ()))) ; Einfaches Bankkonto mit globalem Kontostand: (: balance natural) (define balance 130) ; Abheben vom Kontostand: (: withdraw (natural -> natural)) (define withdraw (lambda (amount) (if (>= balance amount) (begin (set! balance (- balance amount)) balance) (violation "No money!")))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Kontostand lokal halten (: new-withdraw (natural -> natural)) (define new-withdraw (letrec ((balance 130)) (lambda (amount) (if (>= balance amount) (begin (set! balance (- balance amount)) balance) (violation "No money!"))))) ; "Kontenerzeuger", "Abhebungsprozessor" (: make-withdraw (natural -> (natural -> natural))) (define make-withdraw (lambda (balance) (lambda (amount) (if (>= balance amount) (begin (set! balance (- balance amount)) balance) (violation "No money!"))))) ; Zwei Konten (: A1 (natural -> natural)) (define A1 (make-withdraw 130)) (: A2 (natural -> natural)) (define A2 (make-withdraw 130)) ; Ein Konto mit Abhebungs- und Einzahlungsprozedur ; Nachrichten für unser Bankkonto: (define account-message (signature (one-of "withdraw" "deposit"))) ;(: make-account (natural -> (account-message -> (natural -> natural)))) (: make-account (natural -> (account-message -> any))) (define make-account (lambda (init-amount) (letrec ((balance init-amount) (withdraw (lambda (amount) ; Abheben (if (>= balance amount) (begin (set! balance (- balance amount)) balance) (violation "No money!")))) (deposit (lambda (amount) ; Einzahlen (begin (set! balance (+ balance amount)) balance))) (dispatch (lambda (message) (cond ((string=? message "withdraw") withdraw) ((string=? message "deposit") deposit)))) ) dispatch))) (: acct (account-message -> (natural -> natural))) (define acct (make-account 100)) ; Unterschiedliche Gleichheiten: ; Peter und Paul haben zwei getrennte Konten: ;(define peter-acct (make-account 100)) ;(define paul-acct (make-account 100)) ; Peter und Paul haben ein gemeinsames Konto: (define peter-acct (make-account 100)) (define paul-acct peter-acct)