Tracks
/
Common Lisp
Common Lisp
/
Übungen
/
Gigasekundenjubiläum
Gigasekundenjubiläum

Gigasekundenjubiläum

Lernübung

Einführung

Datum und Uhrzeit

In Common Lisp wird Zeit auf vier Arten dargestellt, von denen hier zwei behandelt werden.

  • Die Universalzeit ist eine absolute Zeit, eine Ganzzahl, die die Anzahl der Sekunden seit 1900-01-01T00:00:00Z darstellt (also Mitternacht am 1. Januar 1900 UTC).
  • Die dekodierte Zeit ist ein Tupel aus 9 Werten, die zusammen eine bestimmte Kalenderzeit darstellen: Sekunden, Minuten, Stunde, Tag des Monats, Monat, Jahr, Wochentag, Sommerzeit-Flag, Zeitzone. (Wird unten ausführlich besprochen.)

Universalzeit

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.

Dekodierte Zeit

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:

  • Sekunden: eine Ganzzahl zwischen 0 und 59
  • Minuten: eine Ganzzahl zwischen 0 und 59
  • Stunde: eine Ganzzahl zwischen 0 und 23
  • Tag des Monats: eine Ganzzahl zwischen 1 und 31 (die Obergrenze hängt natürlich vom Monat und Jahr ab)
  • Monat: eine Ganzzahl zwischen 1 und 12
  • Jahr: eine Ganzzahl, die das Jahr angibt.
  • Wochentag: eine Ganzzahl zwischen 0 und 6. 0 bedeutet Montag, 1 bedeutet Dienstag usw. ... 6 bedeutet Sonntag.
  • Sommerzeit-Flag: Ein wahrer Wert zeigt an, dass die Sommerzeit gilt.
  • Zeitzone: eine Anzahl von Stunden zwischen -24 und 24, die den Offset von UTC angibt. Die Zahl ist eine rationale Zahl und muss ein Vielfaches von 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

Mehrere Werte

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.)

Mehrere Werte zurückgeben

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

Umgang mit mehreren Werten

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.

Anleitung

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.

1. Berechne das Datum des Gigasekunden-Jubiläums

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)
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Common Lisp Exercism

Bereit, mit Gigasekundenjubiläum zu starten?

Melde dich bei Exercism an, um Common Lisp mit 27 Konzepte92 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.