Em Common Lisp, o tempo é representado de quatro formas, e duas delas serão abordadas aqui.
1900-01-01T00:00:00Z (ou seja, a meia-noite de 1º de janeiro de 1900 no UTC).Para obter o tempo universal atual, usa-se get-universal-time ou get-decoded-time.
A primeira retorna os segundos atuais desde 1900-01-01T00:00Z e a segunda retorna os mesmos dados em formato decodificado.
decode-universal-time e encode-universal-time são as principais funções para trabalhar com tempo.
A primeira recebe um tempo universal e retorna um tempo decodificado como múltiplos valores, e a segunda recebe os valores de tempo decodificado como argumentos e retorna um tempo universal.
Ambas aceitam um argumento opcional de fuso horário. Veja abaixo o formato do fuso horário.
Um tempo decodificado é 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 retornar um valor, como também pode retornar múltiplos valores.
Por exemplo, floor, que arredonda para baixo em direção ao zero, retorna dois valores: o primeiro é o valor arredondado e o segundo é o resto.
(floor 3.5) ; => 3
; 0.5
(Vamos mostrar os múltiplos valores retornados em linhas separadas da saída.)
Se você quer que uma função retorne múltiplos valores, use o acessador values:
(defun three-numbers () (values 1 2 3))
(three-numbers) ; => 1
; 2
; 3
Se você só se importa com o primeiro valor, não precisa fazer nada de especial, pois a linguagem cuida disso:
(+ (values 1 2 3) (values 10 20 30)) ; => 11
No entanto, se você quiser acessar esses outros valores, vai precisar usar várias funções.
As duas principais macros são multiple-value-list e multiple-value-bind.
Elas servem para envolver algo que retorna múltiplos valores e capturar todos eles.
A primeira cria uma lista com todos os valores.
A segunda permite que você vincule 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 Aliens de Lisp gostam de comemorar aniversários. Para eles, uma data de aniversário importante é o Gigasecond. Ou seja: 1.000.000.000 segundos desde o evento.
Escreva 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 Gigasecond.
Essa função deve retornar a data como uma lista, com a mesma ordem e o mesmo significado dos parâmetros da entrada.
(from 2000 1 1 0 0 0) ; => (2031 9 9 1 46 40)
Crie sua conta no Exercism para aprender e dominar Common Lisp com 27 conceitos92 exercícios e mentoria humana de verdade, tudo de graça.