EMZETT.
Login

Kurz: Racket (früher PLT Scheme) ist ein moderner Nachfolger von Scheme und Lisp. Es ist eine „Programmiersprache zum Bauen von Programmiersprachen“: Mit #lang wählt jede Datei ihre Sprache.

Teil des Kurses Racket

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

Was ist Racket?

Racket (früher PLT Scheme) ist ein moderner Nachfolger von Scheme und Lisp. Es ist eine „Programmiersprache zum Bauen von Programmiersprachen“: Mit #lang wählt jede Datei ihre Sprache; es gibt Sprachen für Anfänger, typisiertes Racket, Datalog, Scribble (Dokumentation) und viele mehr. Racket wird vor allem in der Lehre (How to Design Programs, Bootstrap) und in der Sprachforschung genutzt.

Wie in Lisp ist Code in Klammern geschrieben (S-Ausdrücke), die Standardbibliothek ist aber viel größer: Strings, Hashtabellen, Strukturen, Klassen, Threads, Netzwerk, GUI und Plotten.

Ausführen

racket hallo.rkt          # Datei ausführen
racket                    # interaktive Konsole (REPL)
raco make hallo.rkt       # zu Bytecode übersetzen
raco test hallo.rkt       # Tests ausführen
raco pkg install <paket>  # Paket installieren
drracket                  # Entwicklungsumgebung

Das erste Programm

#lang racket
 
(displayln "Hallo, Welt!")
(printf "1 + 2 = ~a~n" (+ 1 2))
(display "ohne Zeilenumbruch")
(newline)
(println "println zeigt Anführungszeichen")
(write "write auch")
(newline)
(define name "Mia")
(displayln (string-append "Hallo, " name "!"))
(displayln (format "~a hat ~a Punkte" name 17))

Ausgabe:

Hallo, Welt!
1 + 2 = 3
ohne Zeilenumbruch
"println zeigt Anführungszeichen"
"write auch"
Hallo, Mia!
Mia hat 17 Punkte

Die erste Zeile #lang racket ist Pflicht. define bindet Namen, printf und format formatieren mit ~a (Anzeige), ~s (Schreibweise) und ~n (Zeilenumbruch).

Zahlen und Arithmetik

Racket kennt Ganzzahlen beliebiger Größe, exakte Brüche, Fließkommazahlen und komplexe Zahlen:

#lang racket
 
(displayln (+ 1 2 3))
(displayln (/ 10 4))
(displayln (/ 10.0 4))
(displayln (quotient 17 5))
(displayln (remainder 17 5))
(displayln (modulo -7 3))
(displayln (expt 2 100))
(displayln (sqrt 16))
(displayln (sqrt 2))
(displayln (sqrt -4))
(displayln (exact->inexact 1/3))
(displayln (round 2.5))
(displayln (round 3.5))
(displayln (floor 2.7))
(displayln (max 3 9 4))
(displayln (abs -5))
(displayln (inexact->exact (floor 3.9)))
(displayln (number->string 255 16))
(displayln (string->number "ff" 16))
(displayln (integer? 4.0))
(displayln (exact? 1/2))
(displayln (+ 1/3 1/6))

Ausgabe:

6
5/2
2.5
3
2
2
1267650600228229401496703205376
4
1.4142135623730951
0+2i
0.3333333333333333
2.0
4.0
2.0
9
5
3
ff
255
#t
#t
1/2

Variablen und Funktionen

#lang racket
 
(define alter 17)
(define pi-naeherung 3.14159)
(define (quadrat x) (* x x))
(define (begruesse name) (string-append "Hallo, " name "!"))
(define verdopple (lambda (x) (* 2 x)))
 
(displayln (quadrat 7))
(displayln (begruesse "Mia"))
(displayln (verdopple 21))
 
(let ([a 2] [b 3])
  (displayln (+ a b)))
 
(let* ([x 5] [y (* x 2)])
  (displayln (list x y)))
 
(define (summe . zahlen) (apply + zahlen))
(displayln (summe 1 2 3 4))
 
(define (grusz name #:gruss [gruss "Hallo"]) (format "~a, ~a!" gruss name))
(displayln (grusz "Tom"))
(displayln (grusz "Tom" #:gruss "Servus"))
 
(define-values (q r) (quotient/remainder 17 5))
(displayln (list q r))

Ausgabe:

49
Hallo, Mia!
42
5
(5 10)
10
Hallo, Tom!
Servus, Tom!
(3 2)

Merke

  • Jede Racket-Datei beginnt mit #lang racket
  • Aufrufe stehen in Klammern: (funktion arg1 arg2)
  • define bindet Werte und Funktionen, let/let* lokale Namen
  • Racket rechnet mit großen Ganzzahlen, Brüchen und Fließkommazahlen

Übungsaufgabe

Schreibe eine Funktion, die die Fläche eines Kreises berechnet, und gib sie mit printf aus.

Quiz zur Selbstkontrolle

Weiter im Kurs

Weiter: Kontrollfluss und Listen

Alle Kapitel: Racket im Überblick