In Common Lisp il tempo è rappresentato in quattro modi; qui ne vedremo due.
1900-01-01T00:00:00Z (cioè la mezzanotte del 1º gennaio 1900 nel fuso UTC).Per ottenere il tempo universale corrente si usano get-universal-time o get-decoded-time.
Il primo restituisce i secondi correnti trascorsi da 1900-01-01T00:00Z, il secondo restituisce gli stessi dati in formato decodificato.
decode-universal-time e encode-universal-time sono le funzioni principali per lavorare con il tempo.
La prima prende un tempo universale e restituisce un tempo decodificato sotto forma di valori multipli, la seconda prende i valori del tempo decodificato come argomenti e restituisce un tempo universale.
Entrambe accettano un argomento opzionale per il fuso orario. Qui sotto trovi il formato del fuso orario.
Un tempo decodificato è un insieme di valori:
1/3600
(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 una funzione non solo può restituire un valore, ma può restituirne più di uno.
Per esempio floor, che arrotonda verso il basso, restituisce due valori: il primo è il valore arrotondato e il secondo è il resto.
(floor 3.5) ; => 3
; 0.5
(Mostreremo i valori multipli restituiti su righe separate dell'output.)
Se vuoi che una funzione restituisca più valori, usi l'accessor values:
(defun three-numbers () (values 1 2 3))
(three-numbers) ; => 1
; 2
; 3
Se ti interessa solo il primo valore, non serve fare nulla di speciale: ci pensa il linguaggio:
(+ (values 1 2 3) (values 10 20 30)) ; => 11
Se invece vuoi accedere agli altri valori, dovrai usare diverse funzioni.
Le due macro principali sono multiple-value-list e multiple-value-bind.
Servono a racchiudere qualcosa che restituisce più valori e a catturarli tutti.
La prima crea un array con tutti i valori.
La seconda ti permette di associare le variabili ai singoli valori.
(multiple-value-list (values 1 2 3)) ; => (1 2 3)
(multiple-value-bind (a b c) (values 1 2 3)
(+ a b c)) ; => 6
Un'altra funzione utile è nth-value
Agli alieni Lisp piace celebrare gli anniversari. Per loro, un anniversario importante è il gigasecondo. Ovvero: 1.000.000.000 di secondi dall'evento.
Scrivi una funzione from che prende 6 parametri: year, month, day, hour, min, sec e calcola la data e l'ora dell'anniversario del gigasecondo.
Questa funzione dovrebbe restituire la data come un array nello stesso ordine e con lo stesso significato dei parametri di input.
(from 2000 1 1 0 0 0) ; => (2031 9 9 1 46 40)
Iscriviti a Exercism per imparare e padroneggiare Common Lisp con 27 concetti92 esercizi e il mentoring di persone reali, tutto gratis.