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