;;; Konstruktion, Vorlesung vom 23.11.2000 ;;; K8 Datentypen von Scheme ;;; ACHTUNG: jetzt Language-Level "Full Scheme" ;;; Def: Ein Datentyp besteht aus ;;; - einer Menge von Elementen ;;; - einer Menge von Operationen darauf ;;; K8.1 Characters ;;; K8.2 Strings ;;; K8.3 Symbole ;;; K8.4 Paare und Listen ;;; K8.5 Quote ;;; K9 Ein- / Ausgabe ;;; K9.1 Sequentielle Ausführung ;;; K9.2 Einfache Grafik ;;; K8.1 Characters ;;; Elemente: ; Literale vom Typ "char" #\x ; das Zeichen x #\9 ; die Ziffer 9 #\newline ; Zeilenvorschub #\space ; Leerzeichen (define hallo (list #\H #\a #\l #\l #\o #\!)) ;;; Operationen: ; Typ-Prädikat char? ; scheme-value -> boolean ; Funktionen darauf: char=? ; char char -> boolean char boolean ; usw. ; siehe Scheme-Standard, Abschnitt 6.3.4 ;;; K8.2 Strings ;;; Elemente: ; Ein String ist eine Folge von Characters. ; Die Länge eines Strings ist die Anzahl der Characters in ihm. ; Die Characters im String sind von links ab 0 numeriert. ; Literale vom Typ "string" "" "ein String" "ein String mit \"Anführungszeichen\"" ;;; Operationen: ; Typ-Prädikat string? string-length ; string -> number string-ref ; string number -> char ; (string-ref str i) liefert i-tes Zeichen in str string=? ; string string -> boolean string boolean ; usw. ; siehe Scheme-Standard, Abschnitt 6.3.5 ;;; K8.3 Symbole ;;; Elemente: ; Bezeichner und benannte Konstanten. ; Zwei Symbole sind gleich, falls sie gleich geschrieben werden. 'hello (define alte-fussball-spieler (list 'hoeness 'beckenbauer 'rummenigge)) (define formel-1-rennfahrer (list 'michael-schuhmacher 'jacques-villeneuve 'david-coulthard 'rubens-barrichello)) ;;; Operationen: ; Typ-Prädikat symbol? ; einzige Operation: Gleichheit (equal? 'hoeness 'rummenigge) (member 'gilles-villeneuve formel-1-rennfahrer) (member 'david-coulthard formel-1-rennfahrer) ; member : scheme-value list -> scheme-value ; (member x l) ; testet (mit equal?) ob x in l vorkommt. liefert #f, falls nicht ; siehe Scheme-Standard, Abschnitt 6.3.3 ;;; K8.4 Paare und Listen ;;; Elemente: '() ; leere Liste ; cons konstruiert ein Paar aus BELIEBIGEN Scheme-Werten! ; cons : scheme-value scheme-value -> pair (cons 1 2) ; Anzeige: (1 . 2) ; 'dotted pair' (cons 1 '()) ; Anzeige: (1) (cons '() 1) ; Anzeige: (() . 1) (cons (cons (cons '() 3) 2) 1) ; Anzeige: (((() . 3) . 2) . 1) (cons 1 (cons 2 (cons 3 '()))) ; Anzeige: (1 2 3) ; Abk. von: (1 . (2 . (3 . ()))) (cons 1 (cons 2 3)) ; Anzeige: (1 2 . 3) ; Abk. von: (1 . (2 . 3)) ;;; Punkt-Klammer-Zap Regel: ;;; Punkt gefolgt von Klammer-auf kann inklusive der zugehörigen ;;; Klammer-zu entfernt werden. ;;; Eine Kette von Paaren, die nicht mit der leeren Liste endet heisst ;;; "improper list" (cons 'anton (cons 'anton 'anton)) ;;; BEMERKUNG ; empty, first, rest sind Spezialitäten der Einsteiger-Level von DrScheme. ; Die Standardausdrücke von Scheme sind '() ;; für empty null? ;; für empty? pair? ;; für cons? car ;; für first cdr ;; für rest (null? '()) (null? (cons 'holdri 'jo)) (pair? 0) (pair? (cons 'ein-neger-mit-gazel 'le-zagt-im-regen-nie)) (car (cons #t #f)) (cdr (cons "otto" "maier")) ; Weiterhin sind ; (cadr x) == (car (cdr x)) ; (cdddr x) == (cdr (cdr (cdr x)) ; vordefiniert für alle Folgen von a und d bis zur Länge 4. ;;; Weitere Operationen list? ;; Test auf "proper list" length ;; list -> number append ;; list list ... -> list reverse ;; list -> list list-tail ;; list number -> list list-ref ;; list number -> scheme-value member ;; scheme-value list -> scheme-value assoc ;; scheme-value list(pair) -> scheme-value ; siehe Scheme-Standard, Abschnitt 6.3.2 ;;; K8.5 Quote ;;; Literale für konstante Listen ; (1 2 3) ; Fehler: 1 ist nicht Funktion (quote (1 2 3)) ; liefert: (1 2 3) '(1 2 3) ; Abkürzung davon '(1 . 2) ; liefert: (1 . 2) '(hoeness rummenigge beckenbauer) ; liefert: (hoeness rummenigge beckenbauer) '5 ; siehe Scheme-Standard, Abschnitt 4.1.2 ; DEFINITION (Erweiterung von Def K1) ; ::= (quote ) ; Der Wert von (quote e) ist e (als Konstante : scheme-value ; aufgefasst). ;;; K9 Ein- / Ausgabe ;;; K9.1 Hintereinanderausführung ; Standardoperationen: ; ; (display e) zeigt Wert von e an (Ergebnis: unspezifiziert) ; (newline) erzeugt Zeilenvorschub (Ergebnis: unspezifiziert) ; (read) liest ein Literal von der Eingabe ; (begin e1 e2 ... en) ; wertet e1 e2 ... en in Folge aus ; Ergebnis: Wert von en (display 'hello-world!) ; zeigt hello-world! auf dem Bildschirm an (newline) ; (let (...) e1 e2 ... en) == (let (...) (begin e1 e2 ... en)) ; (lambda (...) e1 e2 ... en) == (lambda (...) (begin e1 e2 ... en)) ;;; K9.2 Einfache Grafik ;;; Anfordern der Grafikbibliothek (require-library "graphics.ss" "graphics") ;; Vorbereiten der Grafikbibliothek (open-graphics) ;; Öffnen eines Grafikfensters (mehrfach möglich) ; open-viewport : string number number -> viewport ; (open-viewport title width height) (define v (open-viewport "Sheila Rae, the Brave" 300 200)) (make-rgb 0.2 0.3 0.5) ; Farbe mit 20% rot, 30% grün, 50% blau ;;; mit v : viewport ;;; (draw-line v) : posn posn [color] -> VOID ;;; (draw-ellipse v) : posn number number [color] -> VOID ;;; (draw-pixmap v) : string posn [color] -> VOID ((draw-line v) (make-posn 100 100) (make-posn 200 150)) ((draw-line v) (make-posn 200 150) (make-posn 100 180) (make-rgb 1 0 0)) ((draw-line v) (make-posn 100 180) (make-posn 100 100) (make-rgb 0 1 0)) ((draw-ellipse v) (make-posn 150 100) 80 40 (make-rgb 0 0 1)) ((draw-solid-ellipse v) (make-posn 150 50) 30 70 (make-rgb 1 1 0)) ((draw-pixmap v) "UK_1.gif" (make-posn 10 10)) ((draw-pixmap v) "US_1.gif" (make-posn 200 10)) ;; Schliessen des Grafikfensters (close-viewport v) ;; Beenden der Grafikbibliothek; schliesst noch offene Fenster (close-graphics)