Strings und Zeichen
(use-modules (srfi srfi-13))
(define (zeige x) (display x) (newline))
(define s "Hallo Scheme")
(zeige (string-length s))
(zeige (string-upcase s))
(zeige (string-downcase s))
(zeige (substring s 6 12))
(zeige (string-ref s 0))
(zeige (string-append s "!" "!"))
(zeige (string->list "abc"))
(zeige (list->string (list #\x #\y)))
(zeige (string->number "42"))
(zeige (number->string 3.5))
(zeige (string<? "a" "b"))
(zeige (string=? "x" "x"))
(zeige (string-index s #\S))
(zeige (string-contains s "Sch"))
(zeige (string-join '("a" "b" "c") "-"))
(zeige (string-reverse "Scheme"))
(zeige (string-pad "7" 3 #\0))
(zeige (char-upcase #\a))
(zeige (char->integer #\A))
(zeige (integer->char 66))
(zeige (string->symbol "wort"))
(zeige (symbol->string 'wort))
(zeige (char-numeric? #\5))
(zeige (string-split "a,b,c" #\,))
(zeige (string-trim " x "))
(zeige (string-map char-upcase "abc"))
(zeige (list-tail (string->list "hallo") 3))
(zeige (string-count "banane" #\a))Ausgabe
12 HALLO SCHEME hallo scheme Scheme H Hallo Scheme!! (a b c) xy 42 3.5 #t #t 6 6 a-b-c emehcS 007 A 65 B wort wort #t (a b c) x ABC (l o) 2
Vektoren
(define (zeige x) (display x) (newline))
(define v (vector 5 3 9 1))
(zeige v)
(vector-set! v 0 50)
(zeige (vector-ref v 0))
(zeige (vector-length v))
(zeige (vector->list v))
(zeige (list->vector '(1 2 3)))
(zeige (make-vector 3 0))
(zeige (list->vector (map (lambda (x) (* x x)) (vector->list #(1 2 3)))))
(for-each (lambda (x) (display x) (display ",")) (vector->list #(1 2 3)))
(newline)
(vector-fill! v 7)
(zeige v)
(zeige (vector-copy #(1 2 3)))
(define m (vector (make-vector 3 0) (make-vector 3 1)))
(zeige m)Ausgabe
#(5 3 9 1) 50 4 (50 3 9 1) #(1 2 3) #(0 0 0) #(1 4 9) 1,2,3, #(7 7 7 7) #(1 2 3) #(#(0 0 0) #(1 1 1))
Hashtabellen und Assoziationslisten
(define (zeige x) (display x) (newline))
(define h (make-hash-table))
(hash-set! h 'mia 17)
(hash-set! h 'tom 25)
(zeige (hash-ref h 'mia))
(zeige (hash-ref h 'ben 0))
(zeige (hash-count (lambda (k v) #t) h))
(hash-set! h 'mia (+ 1 (hash-ref h 'mia)))
(zeige (hash-ref h 'mia))
(hash-remove! h 'tom)
(zeige (hash-map->list (lambda (k v) (cons k v)) h))
(define al '((a . 1) (b . 2) (c . 3)))
(zeige (cdr (assq 'b al)))
(zeige (assq 'z al))
(zeige (map car al))
(zeige (map cdr al))
(define zaehler (make-hash-table))
(for-each (lambda (c) (hash-set! zaehler c (+ 1 (hash-ref zaehler c 0))))
(string->list "mississippi"))
(zeige (sort (hash-map->list cons zaehler) (lambda (a b) (char<? (car a) (car b)))))Ausgabe
17 0 2 18 ((mia . 18)) 2 #f (a b c) (1 2 3) ((i . 4) (m . 1) (p . 2) (s . 4))
Records
(use-modules (srfi srfi-9))
(define (zeige x) (display x) (newline))
(define-record-type person
(make-person name alter)
person?
(name person-name)
(alter person-alter set-person-alter!))
(define p (make-person "Mia" 17))
(zeige (person-name p))
(zeige (person? p))
(zeige (person? 42))
(set-person-alter! p 18)
(zeige (person-alter p))
(define (altersgruppe pers)
(cond ((< (person-alter pers) 13) "Kind")
((< (person-alter pers) 18) "Jugendlicher")
(else "Erwachsener")))
(zeige (map altersgruppe (list (make-person "A" 5) (make-person "B" 15) p)))Ausgabe
Mia #t #f 18 (Kind Jugendlicher Erwachsener)
Merke
- Strings, Zeichen und Symbole sind verschiedene Datentypen
- Vektoren haben schnellen Indexzugriff, Hashtabellen und Assoziationslisten ordnen Schlüssel zu
define-record-type(SRFI 9) definiert Datensätze- Guile ergänzt den Standard um viele Hilfsfunktionen (
string-join,string-split, ...)
Aufgabe
Zähle mit einer Hashtabelle die Wörter eines Satzes.