; Aufgabe 6-3 - Bankkonten (define (make-account balance password) (let ((errors 0)) (define (get-balance) balance) (define (withdraw amount) (cond ((< balance amount) (error "Error: Insufficient funds!")) (else (begin (set! balance (- balance amount)) balance)))) (define (deposit amount) (set! balance (+ balance amount)) balance) (define (change-pw newpass) (set! password newpass) (display "Password changed!") (newline)) (define (wrong-password . dummy) (if (< errors 3) (begin (set! errors (+ errors 1)) (display "Error: Wrong password! (") (display (- 3 errors)) (display " tries remaining)") (newline)) (call-police))) (define (call-police) (display "Dade county police! Freeze!") (newline)) (define (dispatch p m) (cond ((eq? p password) (set! errors 0) (cond ((eq? m 'withdraw) withdraw) ((eq? m 'deposit) deposit) ((eq? m 'change-password) change-pw) ((eq? m 'get-balance) get-balance) (else (error "Error: Unknown request to make-account: " m)))) (else wrong-password))) dispatch)) (define (make-special-account account pw second-pw) (if (number? ((account pw 'withdraw) 0)) ; hack for "password ok" (let ((help (cond ((eq? pw 'wrong-password) 'new-wrong-password) (else 'wrong-password)))) (define (dispatch passwd m) (account (if (eq? passwd second-pw) pw help) m)) dispatch))) (define konto (make-account 10 'sesam)) (define konto2 (make-special-account konto 'sesam 'neues-passwort))