Rutas
/
Common Lisp
Common Lisp
/
Ejercicios
/
La lasaña de Lilly
La lasaña de Lilly

La lasaña de Lilly

Ejercicio de aprendizaje

Introducción

Funciones

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

Instrucciones

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

1. Define el tiempo esperado en el horno en minutos

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

2. Calcula los minutos restantes en el horno

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

3. Calcula el tiempo de preparación en minutos

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

4. Calcula el tiempo transcurrido en minutos

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
Editar en GitHub El enlace se abre en una ventana o pestaña nueva
Common Lisp Exercism

¿Listo para empezar La lasaña de Lilly?

Regístrate en Exercism para aprender y dominar Common Lisp con 27 conceptos92 ejercicios y mentoría humana real, todo gratis.