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 # EntwicklungsumgebungDas 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))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))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))49 Hallo, Mia! 42 5 (5 10) 10 Hallo, Tom! Servus, Tom! (3 2)
So führst du den Code aus: Datei hallo.rkt speichern (erste Zeile #lang racket) und mit racket hallo.rkt ausführen (Racket von racket-lang.org, Editor DrRacket).
Merke
- Jede Racket-Datei beginnt mit
#lang racket - Aufrufe stehen in Klammern:
(funktion arg1 arg2) definebindet Werte und Funktionen,let/let*lokale Namen- Racket rechnet mit großen Ganzzahlen, Brüchen und Fließkommazahlen
Aufgabe
Schreibe eine Funktion, die die Fläche eines Kreises berechnet, und gib sie mit printf aus.