Trilhas
/
Common Lisp
Common Lisp
/
Exercícios
/
A lasanha da Lilly
A lasanha da Lilly

A lasanha da Lilly

Exercício de aprendizagem

Introdução

Funções

Para definir uma função global em Common Lisp, usa-se a expressão defun. Essa expressão recebe como primeiro argumento uma lista de parâmetros (uma lista vazia significa que a função não tem parâmetros). Em seguida vem uma string de documentação opcional (veja abaixo) e depois zero ou mais expressões que compõem o "corpo" da função.

Funções podem ter zero ou mais parâmetros.

(defun no-args () (+ 1 1))

(defun add-one (x) (1+ x))

(defun add-nums (x y) (+ x y))

Para chamar uma função, avalia-se uma expressão cujo primeiro elemento é o símbolo que designa a função e cujos itens restantes são os argumentos da função (se houver).

O valor que uma função produz ao ser avaliada é o valor da última expressão avaliada no corpo da função. Todas as funções resultam em um valor.

(add-nums 2 2) ;; => 4

Funções também podem ter, opcionalmente, uma string de documentação (também chamada de 'docstring'). Se fornecida, ela vem depois da lista de argumentos, mas antes do corpo da função. A string de documentação pode ser acessada via documentation.

(defun add-nums (x y) "Add X and Y together" (+ x y))

(documentation 'add-nums 'function) ;; => "Add X and Y together"

;; Note that if one provides a docstring but fails to provide a body
;; then the docstring is interpreted by Common Lisp as the body, not
;; the docstring
(defun no-body ())
(no-body) ;; => NIL

(defun mistake () "This is not a docstring")
(mistake) ;; => "This is not a docstring"
(documentation 'mistake 'function) ;; => NIL

Instruções

Lilly, a alienígena Lisp, está de volta e cozinhando mais! Desta vez, ela vai criar a Lasanha de Alienígena Lisp, que não é tão diferente assim da lasanha humana.

Lilly vai precisar de algumas funções para ajudar a calcular o tempo de cozimento da lasanha. E cada uma precisa ter uma boa documentação, para que Lilly não esqueça o que cada uma faz.

Você pode ajudar Lilly a escrever funções para calcular o tempo de cozimento da lasanha?

1. Defina o tempo esperado no forno em minutos

Defina a função expected-time-in-oven, que não recebe nenhum parâmetro e retorna quantos minutos a lasanha deve ficar no forno. De acordo com a tradição dos alienígenas Lisp (assim como a unidade parental de Lilly costumava cozinhar), o tempo esperado no forno, em minutos, é 337:

(expected-time-in-oven) ;; => 337

2. Calcule o tempo restante no forno em minutos

Defina a função remaining-minutes-in-oven, que recebe como parâmetro os minutos que a lasanha já passou no forno e retorna quantos minutos a lasanha ainda precisa ficar lá, com base no tempo esperado no forno em minutos da tarefa anterior.

(remaining-minutes-in-oven 100) ;; => 237

3. Calcule o tempo de preparo em minutos

Defina a função preparation-time-in-minutes, que recebe como parâmetro o número de camadas que Lilly adicionou à lasanha e retorna quantos minutos Lilly passou preparando a lasanha, considerando que cada camada leva 19 minutos para preparar.

(preparation-time-in-minutes 3) ;; => 57

4. Calcule o tempo decorrido em minutos

Defina a função elapsed-time-in-minutes, que recebe dois parâmetros: o primeiro é o número de camadas que Lilly adicionou à lasanha, e o segundo é o número de minutos que a lasanha está no forno. A função deve retornar quantos minutos Lilly passou cozinhando a lasanha, ou seja, a soma do tempo de preparo em minutos com o tempo em minutos que a lasanha já passou no forno até o momento.

(elapsed-time-in-minutes 3 100) ;; => 157
Editar via GitHub O link abre em uma nova janela ou aba
Common Lisp Exercism

Tudo pronto para começar A lasanha da Lilly?

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.