Programmierparadigmen D. Rösner Institut für Wissens- und Sprachverarbeitung Fakultät für Informatik Otto-von-Guericke Universität Magdeburg Sommer 2011, 20. Juni 2011, c 2011 D.Rösner D. Rösner PGP 2011... 1
Gliederung 1 Funktionales Programmieren Einführung Sprachmittel Veränderbare Listenstrukturen D. Rösner PGP 2011... 2
Objekte: Motivation Motivation beim Modellieren zu implementierender Systeme sollte man sich an den Objekten des zu modellierenden Weltausschnitts orientieren Objektorientierung ein Aspekt: Objekte bleiben erhalten, auch wenn sich einzelne Werte ihrer Eigenschaften verändern Beispiel: Konto kann unterschiedliche Kontostände haben s.a. [AS96], Ch. 3 D. Rösner PGP 2011... 4
Sprachmittel in SCHEME (set! < name > < wert >) Semantik: nach Auswertung dieses S-Ausdruck ist der Wert von < name > der aus dem Ausdruck < wert > erhaltene Wert mit der Zuweisung set! ist der rein funktionale Teil von Scheme verlassen Spezialformen wie set! heissen auch Destruktoren s.a. [AS96], Ch. 3.1 D. Rösner PGP 2011... 5
Sprachmittel in SCHEME Modellierung eines Bankkontos (zu simpler Ansatz) (define balance 100) (define (withdraw amount) (if (>= balance amount) (begin (set! balance (- balance amount)) balance) "Kontostand nicht ausreichend")) (beachte: Scheme-Version R5RS); s.a. [AS96], Ch. 3.1 D. Rösner PGP 2011... 6
Sprachmittel in SCHEME Modellierung eines Bankkontos (zu simpler Ansatz) mögliche Interaktion > balance 100 > (withdraw 25) 75 > (withdraw 25) 50 > (withdraw 60) "Kontostand nicht ausreichend" > balance 50 s.a. [AS96], Ch. 3.1 D. Rösner PGP 2011... 7
Sprachmittel in SCHEME Modellierung eines Bankkontos (zu simpler Ansatz) beachte: withdraw ist keine mathematische Funktion mehr Seiteneffekte auf globale Variable keine Kapselung Frage: wie mehrere Bankkonten behandeln? s.a. [AS96], Ch. 3.1 D. Rösner PGP 2011... 8
Objekte in SCHEME Modellierung eines Bankkontos hier balance gekapselt (information hiding) (define (make-withdraw balance) (lambda (amount) (if (>= balance amount) (begin (set! balance (- balance amount)) balance) "Kontostand nicht ausreichend"))) s.a. [AS96], Ch. 3.1.1 D. Rösner PGP 2011... 9
Objekte in SCHEME Modellierung von Bankkonten mögliche Interaktion: > (define w1 (make-withdraw 100)) > (define w2 (make-withdraw 100)) > (w1 50) 50 > (w2 70) 30 > (w2 40) "Kontostand nicht ausreichend" > (w1 40) 10 s.a. [AS96], Ch. 3 D. Rösner PGP 2011... 10
Objekte in SCHEME Bankkonto: Variante mit Abhebungen und Einzahlungen (define (make-account balance) (define (withdraw amount) (if (>= balance amount) (begin (set! balance (- balance amount)) balance) (display "Kontostand nicht ausreichend"))) (define (deposit amount) (set! balance (+ balance amount)) balance) (define (dispatch m) (cond ((eq? m withdraw) withdraw) ((eq? m deposit) deposit) (else (begin (display "Nachricht únbekannt -- MAKE-ACCOUNT: ") (write m))))) dispatch ) D. Rösner PGP 2011... 11
Objekte in SCHEME Bankkonto: realistischere Variante mit Abhebungen und Einzahlungen dispatch repräsentiert das Konto der Aufruf der beiden Methoden erfolgt im Stil des Nachrichten übergeben (engl. message passing) es können problemlos unterschiedliche Instanzen gebildet werden D. Rösner PGP 2011... 12
Objekte in SCHEME Modellierung von Bankkonten mögliche Interaktion: > (define acc1 (make-account 100)) > ((acc1 withdraw) 50) 50 > ((acc1 withdraw) 60) Kontostand nicht ausreichend > ((acc1 deposit) 40) 90 > ((acc1 withdraw) 60) 30 s.a. [AS96], Ch. 3.1.1 D. Rösner PGP 2011... 13
Objekte in SCHEME die Verwendung von Konsequenzen set! hat weitreichende das Substitutionsmodell ist nicht mehr anwendbar um mit Objekten und Zuweisung arbeiten zu können, reichen einfache Modelle mit hübschen mathematischen Eigenschaften nicht aus s.a. [AS96], Ch. 3.1.2 D. Rösner PGP 2011... 14
Objekte in SCHEME Kontrast: (define (make-simplified-withdraw balance) (lambda (amount) (set! balance (- balance amount)) balance)) aber: (define (make-decrementer balance) (lambda (amount) (- balance amount))) s.a. [AS96], Ch. 3.1.2 D. Rösner PGP 2011... 15
Objekte in SCHEME auf make-decrementer ist das Substitutionsmodell anwendbar Beispiel: ((make-decrementer 25) 20) ((lambda (amount)(- 25 amount)) 20) (- 25 20) 5 s.a. [AS96], Ch. 3.1.2 D. Rösner PGP 2011... 16
Objekte in SCHEME Anwendung des Substitutionsmodell auf make-simplified-withdraw führt zu > ((make-simplified-withdraw 25) 20) > (lambda (amount) (set! balance (- 25 amount)) 25) 20) > (set! balance (- 25 20)) 25 D. Rösner PGP 2011... 17
Objekte in SCHEME um Substitution anwenden zu können, dürfen Symbole lediglich als Namen für Werte stehen wird set! und die Idee eingeführt, dass der Wert einer Variable sich ändern kann, kann eine Variable nicht mehr einfach nur ein Name sein eine Variable verweist dann auf einen Platz, an dem ein Wert gespeichert (und verändert) werden kann s.a. [AS96], Ch. 3.1.2 D. Rösner PGP 2011... 18
Veränderbare Listenstrukturen grundlegende Operationen für Konstruktionen und Selektion in Paare/Listen: cons,car, cdr list, append Modifikation der Listenstruktur damit nicht möglich zusätzliche Mutatoren für Paare: set-car!, set-cdr! Syntax: (set-car! <pair> <value>) (set-cdr! <pair> <value>) D. Rösner PGP 2011... 19
Veränderbare Listenstrukturen Beispiel: (define x ((a b) c d)) (define y (e f)) (set-car! x y) (define z (cons y (cdr x))) D. Rösner PGP 2011... 20
Veränderbare Listenstrukturen Implementierung von append: (define (append x y) (if (null? x) y (cons (car x) (append (cdr x) y)))) Implementierung von append! (define (append! x y) (set-cdr! (last x) y) x) (define (last x) (if (null? (cdr x)) x (last (cdr x)))) D. Rösner PGP 2011... 21
Veränderbare Listenstrukturen eine Iteraktion: (define x (list a b)) (define y (list c d)) (define z (append x y)) z (cdr x) (define w (append! x y)) w (cdr x) D. Rösner PGP 2011... 22
Veränderbare Listenstrukturen Identisch?: (define x (list a b)) (define z1 (cons x x)) (define z2 (cons (list a b) (list a b))) Was passiert bei (set-wow! z1) und (set-wow! z2)? (define (set-wow! x) (set-car! (car x) wow) x) D. Rösner PGP 2011... 23
Literatur: I H. Abelson and G.J. Sussman. Structure and Interpretation of Computer Programs. MIT Press, Cambridge, Massachusetts London, England, 1996. Michael Lee Scott. Programming Language Pragmatics. Academic Press, San Diego, CA, USA, 2000. ISBN 1-55860-578-9. D. Rösner PGP 2011... 24