Em Common Lisp, o tempo é representado de quatro formas, duas das quais vamos abordar aqui.
1900-01-01T00:00:00Z (ou seja, a meia-noite de 1 de janeiro de 1900 em UTC).Para obter o tempo universal atual, usa-se get-universal-time ou get-decoded-time.
O primeiro devolve os segundos atuais desde 1900-01-01T00:00Z e o segundo devolve os mesmos dados em formato descodificado.
decode-universal-time e encode-universal-time são as funções principais para trabalhar com o tempo.
A primeira recebe um tempo universal e devolve um valor de tempo descodificado como múltiplos valores, e a segunda recebe os valores de tempo descodificado como argumentos e devolve um tempo universal.
Ambas recebem um argumento opcional de fuso horário. Vê abaixo o formato do fuso horário.
Um tempo descodificado é um conjunto de valores:
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
Em Common Lisp, uma função não só pode devolver um valor como pode devolver vários valores.
Por exemplo, floor, que arredonda para baixo em direção ao zero, devolve dois valores: o primeiro é o valor arredondado e o segundo é o resto.
(floor 3.5) ; => 3
; 0.5
(Vamos mostrar os múltiplos valores devolvidos em linhas separadas da saída.)
Se queres que uma função devolva múltiplos valores, usas o acessor values:
(defun three-numbers () (values 1 2 3))
(three-numbers) ; => 1
; 2
; 3
Se só te interessa o primeiro valor, não é preciso fazer nada de especial, porque a linguagem trata disso:
(+ (values 1 2 3) (values 10 20 30)) ; => 11
No entanto, se quiseres aceder a esses outros valores, há várias funções que vais precisar de usar.
Há duas macros principais: multiple-value-list e multiple-value-bind.
São usadas para envolver algo que devolve múltiplos valores e captam todos os valores.
A primeira cria uma lista com todos os valores.
A segunda permite-te ligar variáveis aos valores individuais.
(multiple-value-list (values 1 2 3)) ; => (1 2 3)
(multiple-value-bind (a b c) (values 1 2 3)
(+ a b c)) ; => 6
Outra função útil é nth-value
Os Lisp Aliens gostam de celebrar aniversários. Para eles, uma data de aniversário importante é o gigasegundo. Ou seja: 1 000 000 000 segundos desde o evento.
Escreve uma função from que recebe 6 parâmetros: year, month, day, hour, min, sec e calcula a data e a hora do aniversário do gigasegundo.
Esta função deve devolver a data numa lista com a mesma ordem e o mesmo significado dos parâmetros que recebe.
(from 2000 1 1 0 0 0) ; => (2031 9 9 1 46 40)
Inscreve-te no Exercism para aprenderes e dominares Common Lisp com 27 conceitos92 exercícios, e mentoria humana real, tudo grátis.