Para definir una función global en Common Lisp se usa la expresión defun.
Esta expresión toma como primer argumento una lista de parámetros (una lista vacía significa que la función no tiene parámetros).
A continuación viene una cadena de documentación opcional (ver más abajo) y, después, cero o más expresiones que forman el «cuerpo» de la función.
Las funciones pueden tener cero o más parámetros.
(defun no-args () (+ 1 1))
(defun add-one (x) (1+ x))
(defun add-nums (x y) (+ x y))
Para llamar a una función se evalúa una expresión cuyo primer elemento es el símbolo que designa la función y cuyos elementos restantes son los argumentos de la función (si los hay).
El valor al que se evalúa una función es el valor de la última expresión evaluada en el cuerpo de la función. Todas las funciones se evalúan a un valor.
(add-nums 2 2) ;; => 4
Las funciones también pueden tener, de forma opcional, una cadena de documentación (también llamada «docstring»).
Si se incluye, va después de la lista de argumentos, pero antes del cuerpo de la función.
Se puede acceder a la cadena de documentación mediante 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, el alienígena de Lisp, ha vuelto y ahora cocina más que nunca! Esta vez va a crear la Lisp Alien Lasagna, que no es del todo distinta de la lasaña humana.
Lilly necesitará que se escriban algunas funciones que ayuden a calcular los tiempos de cocción de la lasaña. Y cada una debe tener una buena documentación para que Lilly no olvide qué hace.
¿Puedes ayudar a Lilly a escribir funciones que le ayuden a calcular el tiempo de cocción de la lasaña?
Define la función expected-time-in-oven, que no recibe ningún parámetro y devuelve cuántos minutos debe estar la lasaña en el horno. Según la tradición de los alienígenas de Lisp (igual que cocinaba la unidad parental de Lilly), el tiempo esperado en el horno en minutos es 337:
(expected-time-in-oven) ;; => 337
Define la función remaining-minutes-in-oven, que recibe como parámetro los minutos reales que la lasaña lleva en el horno y devuelve cuántos minutos tiene que seguir la lasaña en el horno, según el tiempo esperado en el horno en minutos de la tarea anterior.
(remaining-minutes-in-oven 100) ;; => 237
Define la función preparation-time-in-minutes, que recibe como parámetro el número de capas que Lilly añadió a la lasaña y devuelve cuántos minutos dedicó Lilly a preparar la lasaña, suponiendo que cada capa tarda 19 minutos en prepararse.
(preparation-time-in-minutes 3) ;; => 57
Define la función elapsed-time-in-minutes, que recibe dos parámetros: el primer parámetro es el número de capas que Lilly añadió a la lasaña y el segundo parámetro es el número de minutos que la lasaña lleva en el horno. La función debe devolver cuántos minutos ha trabajado Lilly cocinando la lasaña, que es la suma del tiempo de preparación en minutos y el tiempo en minutos que la lasaña lleva en el horno en ese momento.
(elapsed-time-in-minutes 3 100) ;; => 157
Regístrate en Exercism para aprender y dominar Common Lisp con 27 conceptos92 ejercicios y mentoría humana real, todo gratis.