Kurz: Racket hat ein eigenes Objektsystem mit class:
Teil des Kurses Racket
Klassen und Objekte
Racket hat ein eigenes Objektsystem mit class:
#lang racket
(define tier%
(class object%
(init-field name)
(super-new)
(define/public (laut) "...")
(define/public (vorstellen) (format "~a sagt ~a" name (laut)))))
(define hund%
(class tier%
(super-new)
(define/override (laut) "Wau")
(define/public (apportiere) (format "~a holt den Stock" (get-field name this)))))
(define katze%
(class tier%
(super-new)
(define/override (laut) "Miau")))
(define tiere (list (new hund% [name "Rex"]) (new katze% [name "Mimi"])))
(for ([t tiere]) (displayln (send t vorstellen)))
(displayln (send (first tiere) apportiere))
(displayln (is-a? (first tiere) tier%))
(displayln (is-a? (second tiere) hund%))
(displayln (map (lambda (t) (send t laut)) tiere))Ausgabe:
Rex sagt Wau
Mimi sagt Miau
Rex holt den Stock
#t
#f
(Wau Miau)Module
Jede Datei ist ein Modul; provide exportiert, require importiert. Mit module lassen sich Untermodule in einer Datei definieren:
#lang racket
(module geometrie racket
(provide kreisflaeche rechteckflaeche)
(define (kreisflaeche r) (* pi r r))
(define (rechteckflaeche b h) (* b h)))
(require 'geometrie)
(displayln (rechteckflaeche 3 4))
(displayln (real->decimal-string (kreisflaeche 1) 4))
(require racket/list racket/string)
(displayln (take '(1 2 3) 2))
(module+ test
(require rackunit)
(check-equal? (rechteckflaeche 2 3) 6))Ausgabe:
12
3.1416
(1 2)Typisiertes Racket
#lang typed/racket prüft Typen vor der Ausführung:
#lang typed/racket
(: quadrat (-> Number Number))
(define (quadrat x) (* x x))
(: summe (-> (Listof Integer) Integer))
(define (summe l) (apply + l))
(struct Punkt ([x : Real] [y : Real]))
(: abstand (-> Punkt Punkt Real))
(define (abstand a b)
(sqrt (+ (sqr (- (Punkt-x a) (Punkt-x b))) (sqr (- (Punkt-y a) (Punkt-y b))))))
(displayln (quadrat 7))
(displayln (summe '(1 2 3)))
(displayln (abstand (Punkt 0 0) (Punkt 3 4)))
(: sicher-teile (-> Integer Integer (U Integer 'fehler)))
(define (sicher-teile a b) (if (zero? b) 'fehler (quotient a b)))
(displayln (list (sicher-teile 10 2) (sicher-teile 1 0)))Ausgabe:
49
6
5
(5 fehler)Tests mit rackunit
#lang racket
(require rackunit)
(define (fakultaet n) (if (<= n 1) 1 (* n (fakultaet (- n 1)))))
(check-equal? (fakultaet 5) 120)
(check-equal? (fakultaet 0) 1)
(check-true (even? 4))
(check-exn exn:fail:contract:divide-by-zero? (lambda () (/ 1 0)))
(test-case "Liste"
(check-equal? (map add1 '(1 2)) '(2 3)))
(displayln "alle Tests liefen ohne Ausgabe durch")Ausgabe:
alle Tests liefen ohne Ausgabe durchMerke
- Klassen:
class,init-field,define/public,define/override,new,send - Jede Datei ist ein Modul (
provide,require);module+ testfür Tests typed/racketfügt ein statisches Typsystem hinzurackunitprüft Funktionen mitcheck-equal?& Co.
Übungsaufgabe
Schreibe eine Klasse konto% mit einzahlen und stand und teste sie.
Quiz zur Selbstkontrolle
Wie ruft man eine Methode auf?
- (send objekt methode args) (richtig)
- objekt.methode(args)
- (objekt methode)
- objekt->methode
Wofür steht provide?
- Exportiert Namen aus einem Modul (richtig)
- Importiert Namen
- Definiert eine Klasse
- Startet Tests
Was bringt #lang typed/racket?
- Ein statisches Typsystem (richtig)
- Schnellere Compiler
- Eine GUI
- Mehr Makros
Weiter im Kurs
Zurück: Funktionen höherer Ordnung und Makros
Weiter: Ein-/Ausgabe, Zeit und Nebenläufigkeit
Alle Kapitel: Racket im Überblick