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
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?
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
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
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
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
Inscreve-te no Exercism para aprenderes e dominares Common Lisp com 27 conceitos92 exercícios, e mentoria humana real, tudo grátis.