Percursos
/
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, usamos a expressão defun. Esta expressão recebe como primeiro argumento uma lista de parâmetros (uma lista vazia significa que a função não tem parâmetros). A seguir vem uma string de documentação opcional (ver abaixo) e, depois, zero ou mais expressões que constituem o "corpo" da função.

As 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 em que o símbolo que designa a função é o primeiro elemento e os argumentos da função (se existirem) são os elementos restantes da expressão.

O valor de uma função é o valor da última expressão avaliada no corpo dessa função. Todas as funções produzem um valor.

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

As funções podem também ter, opcionalmente, uma string de documentação (também chamada 'docstring'). Se existir, vem depois da lista de argumentos, mas antes do corpo da função. Podes aceder à string de documentação através de 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

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

A Lilly vai precisar de algumas funções para a ajudar a calcular os tempos de cozedura da lasanha. E cada uma delas tem de ter boa documentação, para a Lilly não se esquecer do que cada uma faz.

Consegues ajudar a Lilly a escrever funções que a ajudem a cronometrar a cozedura da lasanha?

1. Define o tempo previsto no forno, em minutos

Define a função expected-time-in-oven, que não recebe parâmetros e devolve quantos minutos a lasanha deve estar no forno. De acordo com a tradição dos alienígenas do Lisp (tal como a unidade parental da Lilly costumava cozinhar), o tempo previsto no forno é de 337 minutos:

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

2. Calcula o tempo restante no forno, em minutos

Define a função remaining-minutes-in-oven, que recebe como parâmetro os minutos que a lasanha já esteve no forno e devolve quantos minutos a lasanha ainda tem de permanecer no forno, com base no tempo previsto no forno da tarefa anterior.

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

3. Calcula o tempo de preparação, em minutos

Define a função preparation-time-in-minutes, que recebe como parâmetro o número de camadas que a Lilly acrescentou à lasanha e devolve quantos minutos a Lilly passou a preparar a lasanha, assumindo que cada camada demora 19 minutos a preparar.

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

4. Calcula o tempo decorrido, em minutos

Define a função elapsed-time-in-minutes, que recebe dois parâmetros: o primeiro é o número de camadas que a Lilly acrescentou à lasanha e o segundo é o número de minutos que a lasanha já esteve no forno. A função deve devolver quantos minutos a Lilly já trabalhou a cozinhar a lasanha, ou seja, a soma do tempo de preparação, em minutos, com o tempo, em minutos, que a lasanha já passou no forno até ao momento.

(elapsed-time-in-minutes 3 100) ;; => 157
Editar via GitHub A ligação abre numa nova janela ou separador
Common Lisp Exercism

Estás pronto para começar A lasanha da Lilly?

Inscreve-te no Exercism para aprenderes e dominares Common Lisp com 27 conceitos92 exercícios, e mentoria humana real, tudo grátis.