Trilhas
/
Common Lisp
Common Lisp
/
Exercícios
/
Aniversário de gigassegundo
Aniversário de gigassegundo

Aniversário de gigassegundo

Exercício de aprendizagem

Introdução

Data e hora

Em Common Lisp, o tempo é representado de quatro formas, e duas delas serão abordadas aqui.

  • O tempo universal é um tempo absoluto, um número inteiro que representa a quantidade de segundos desde 1900-01-01T00:00:00Z (ou seja, a meia-noite de 1º de janeiro de 1900 no UTC).
  • O tempo decodificado é uma tupla de 9 valores que, juntos, representam um momento específico do calendário: segundos, minutos, hora, dia do mês, mês, ano, dia da semana, indicador de horário de verão e fuso horário. (Detalhado abaixo.)

Tempo universal

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.

Tempo 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:

  • segundos: um número inteiro entre 0 e 59
  • minutos: um número inteiro entre 0 e 59
  • hora: um número inteiro entre 0 e 23
  • dia do mês: um número inteiro entre 1 e 31 (o limite superior, obviamente, depende do mês e do ano)
  • mês: um número inteiro entre 1 e 12
  • ano: um número inteiro que indica o ano.
  • dia da semana: um número inteiro entre 0 e 6. 0 significa segunda-feira, 1 significa terça-feira etc. ... 6 significa domingo.
  • indicador de horário de verão: um valor verdadeiro indica que o horário de verão está em vigor.
  • fuso horário: um número de horas entre -24 e 24 que indica o deslocamento em relação ao UTC. O número é um número racional e deve ser um múltiplo de 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

Múltiplos valores

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

Retornar múltiplos valores

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

Lidar com múltiplos valores

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

Instruções

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.

1. Calcule a data do aniversário do Gigasecond

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)
Editar via GitHub O link abre em uma nova janela ou aba
Common Lisp Exercism

Tudo pronto para começar Aniversário de gigassegundo?

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.