In Common Lisp wird Zeit auf vier Arten dargestellt, von denen hier zwei behandelt werden.
1900-01-01T00:00:00Z darstellt (also Mitternacht am 1. Januar 1900 UTC).Um die aktuelle Universalzeit zu erhalten, verwendet man get-universal-time oder get-decoded-time.
Ersteres gibt die aktuellen Sekunden seit 1900-01-01T00:00Z zurück, Letzteres gibt dieselben Daten im dekodierten Format zurück.
decode-universal-time und encode-universal-time sind die wichtigsten Funktionen für die Arbeit mit Zeit.
Ersteres nimmt eine Universalzeit und gibt einen dekodierten Zeitwert als mehrere Werte zurück, Letzteres nimmt die dekodierten Zeitwerte als Argumente und gibt eine Universalzeit zurück.
Beide akzeptieren ein optionales Argument für die Zeitzone. Das Format der Zeitzone wird unten beschrieben.
Eine dekodierte Zeit besteht aus einer Reihe von Werten:
1/3600 sein.(encode-universal-time 1 2 3 4 5 2000 0) ; => 3166398121
(decode-universal-time 3166398121) ; => 1
; 2
; 3
; 4
; 5
; 2000
; 3 (Thursday)
; NIL
; 0
(decode-universal-time 2208988800) ; => 0
; 0
; 0
; 1
; 1
; 1970
; 3
; NIL
; 0
In Common Lisp kann eine Funktion nicht nur einen Wert zurückgeben, sondern auch mehrere Werte zurückgeben.
Zum Beispiel gibt floor, das in Richtung Null abrundet, zwei Werte zurück: Der erste ist der gerundete Wert und der zweite ist der Rest.
(floor 3.5) ; => 3
; 0.5
(Wir zeigen mehrere zurückgegebene Werte in separaten Zeilen der Ausgabe.)
Wenn du möchtest, dass eine Funktion mehrere Werte zurückgibt, verwendest du den values-Accessor:
(defun three-numbers () (values 1 2 3))
(three-numbers) ; => 1
; 2
; 3
Wenn dich nur der erste Wert interessiert, musst du nichts Besonderes tun, denn die Sprache erledigt das für dich:
(+ (values 1 2 3) (values 10 20 30)) ; => 11
Wenn du jedoch auf die anderen Werte zugreifen möchtest, musst du mehrere Funktionen verwenden.
Zwei wichtige Makros sind multiple-value-list und multiple-value-bind.
Mit ihnen kannst du etwas umschließen, das mehrere Werte zurückgibt, und dabei alle Werte erfassen.
Ersteres erstellt eine Liste aller Werte.
Mit dem zweiten kannst du Variablen an die einzelnen Werte binden.
(multiple-value-list (values 1 2 3)) ; => (1 2 3)
(multiple-value-bind (a b c) (values 1 2 3)
(+ a b c)) ; => 6
Eine weitere nützliche Funktion ist nth-value.
Lisp-Aliens feiern gern Jubiläen. Für sie ist ein wichtiges Jubiläumsdatum die Gigasekunde. Das heißt: 1.000.000.000 Sekunden seit dem Ereignis.
Schreibe eine Funktion from, die 6 Parameter entgegennimmt: year, month, day, hour, min, sec, und das Datum und die Uhrzeit des Gigasekunden-Jubiläums berechnet.
Diese Funktion soll das Datum als Liste in derselben Reihenfolge und mit derselben Bedeutung wie die Parameter der Eingabe zurückgeben.
(from 2000 1 1 0 0 0) ; => (2031 9 9 1 46 40)
Melde dich bei Exercism an, um Common Lisp mit 27 Konzepte92 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.