EMZETT.
Login

Kurz: (define pfad (make-temporary-file “racket~a.txt”)) (display-lines-to-file ’(“eins” “zwei” “drei”) pfad #:exists ‘truncate) (displayln (file->lines pfad)) (displayln (file->string pfad)) (with-output-to-file pfad #:exists ‘append.

Teil des Kurses Racket

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

Dateien

#lang racket
 
(define pfad (make-temporary-file "racket~a.txt"))
(display-lines-to-file '("eins" "zwei" "drei") pfad #:exists 'truncate)
(displayln (file->lines pfad))
(displayln (file->string pfad))
(with-output-to-file pfad #:exists 'append (lambda () (displayln "vier")))
(displayln (length (file->lines pfad)))
(call-with-input-file pfad
  (lambda (in)
    (let loop ([n 1])
      (define zeile (read-line in))
      (unless (eof-object? zeile)
        (printf "~a: ~a~n" n zeile)
        (loop (add1 n))))))
(with-output-to-file pfad #:exists 'truncate (lambda () (write '(a "b" 3))))
(displayln (file->value pfad))
(displayln (file-exists? pfad))
(delete-file pfad)
(displayln (file-exists? pfad))

Ausgabe:

(eins zwei drei)
eins
zwei
drei
 
4
1: eins
2: zwei
3: drei
4: vier
(a b 3)
#t
#f

Strings als Ports

#lang racket
 
(define ausgabe (open-output-string))
(fprintf ausgabe "Zahl: ~a~n" 42)
(write 'symbol ausgabe)
(displayln (get-output-string ausgabe))
 
(define eingabe (open-input-string "10 20 30 abc"))
(let loop ([summe 0])
  (define x (read eingabe))
  (cond [(number? x) (loop (+ summe x))]
        [else (displayln summe)]))
 
(displayln (with-output-to-string (lambda () (display "eingefangen"))))
(displayln (read (open-input-string "(1 (2 3))")))
(displayln (port->lines (open-input-string "a\nb\nc")))
(printf "~s ~a ~v~n" "text" "text" "text")

Ausgabe:

Zahl: 42
symbol
60
eingefangen
(1 (2 3))
(a b c)
"text" text "text"

Zeit, Zufall und Prozesse

#lang racket
(require racket/date)
 
(define d (seconds->date 0 #f))
(displayln (list (date-year d) (date-month d) (date-day d)))
(displayln (date->string (seconds->date 86400 #f)))
(displayln (> (current-seconds) 1700000000))
(displayln (> (current-inexact-milliseconds) 0))
(random-seed 42)
(displayln (< -1 (random 100) 100))
(displayln (length (shuffle '(1 2 3 4 5))))
(displayln (sort (shuffle '(3 1 2)) <))
(displayln (> (vector-length (current-command-line-arguments)) -1))
(displayln (string? (path->string (current-directory))))
(displayln (getenv "NICHT_GESETZT_XYZ"))

Ausgabe:

(1970 1 1)
Friday, January 2nd, 1970
#t
#t
#t
5
(1 2 3)
#t
#t
#f

Threads und Kanäle

#lang racket
 
(define ch (make-channel))
(void (thread (lambda ()
                (for ([i 3]) (channel-put ch (* i i)))
                (channel-put ch 'ende))))
(let loop ()
  (define x (channel-get ch))
  (unless (eq? x 'ende)
    (printf "empfangen: ~a~n" x)
    (loop)))
 
(define ergebnisse
  (for/list ([i 4])
    (define t (thread (lambda () (sleep 0.01) (* i i))))
    t))
(for-each thread-wait ergebnisse)
(displayln "alle Threads fertig")
 
(define sem (make-semaphore 1))
(define zaehler 0)
(define arbeiter
  (for/list ([i 4])
    (thread (lambda ()
              (for ([j 100])
                (semaphore-wait sem)
                (set! zaehler (add1 zaehler))
                (semaphore-post sem))))))
(for-each thread-wait arbeiter)
(displayln zaehler)
 
(define fut (future (lambda () (for/sum ([i 100000]) i))))
(displayln (touch fut))

Ausgabe:

empfangen: 0
empfangen: 1
empfangen: 4
alle Threads fertig
400
4999950000

Merke

  • Dateien: file->lines, display-lines-to-file, call-with-input-file, with-output-to-file
  • Ports sind die Grundlage der Ein-/Ausgabe, auch für Strings (open-input-string)
  • thread, channel-put/channel-get, semaphore und future für Nebenläufigkeit
  • read liest Racket-Datenstrukturen direkt ein

Übungsaufgabe

Lies eine Datei ein und zähle die Wörter pro Zeile mit for/list.

Quiz zur Selbstkontrolle

Weiter im Kurs

Zurück: Klassen, Module und Typen

Weiter: Praxisprojekte

Alle Kapitel: Racket im Überblick