EMZETT.
Login

Kurz: Racket hat ein eigenes Objektsystem mit class:

Teil des Kurses Racket

Kapitel 5 von 8 im Kurs Racket. Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

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 durch

Merke

  • Klassen: class, init-field, define/public, define/override, new, send
  • Jede Datei ist ein Modul (provide, require); module+ test für Tests
  • typed/racket fügt ein statisches Typsystem hinzu
  • rackunit prüft Funktionen mit check-equal? & Co.

Übungsaufgabe

Schreibe eine Klasse konto% mit einzahlen und stand und teste sie.

Quiz zur Selbstkontrolle

Weiter im Kurs

Zurück: Funktionen höherer Ordnung und Makros

Weiter: Ein-/Ausgabe, Zeit und Nebenläufigkeit

Alle Kapitel: Racket im Überblick