En Clojure, vincular un valor a un nombre se conoce como var. Las vars de nivel superior (globales) son similares a las constantes de otros lenguajes.
Las vars de nivel superior se definen con def:
(def fingers 10)
fingers
;;=> 10
Puedes usar defn para definir una función que recibe cero o más argumentos. Esta es una función que suma dos números:
(defn add [x y]
(+ x y))
Esta función recibe dos argumentos que se colocan en el vector [x y], seguidos del cuerpo de la función, que puede contener cualquier número de expresiones. El valor devuelto es siempre el resultado de evaluar la última expresión del cuerpo, (+ x y). Esta expresión es una lista que representa una llamada a una función. El primer elemento de la lista es la función +, que se evalúa usando los siguientes elementos, x e y, como argumentos.
La función add definida antes se llama de la misma forma:
(add 2 3)
;;=> 5
Las funciones y los valores en Clojure solo se pueden usar después de haber sido definidos, es decir, las formas siempre se evalúan en el orden en que aparecen.
En Clojure, los espacios en blanco no tienen ninguna relevancia más allá del formato.
Las funciones y las vars de Clojure se organizan en namespaces. Un namespace agrupa funcionalidad relacionada y se define con la macro ns:
(ns calculator)
(def pi 3.14)
(defn add [x y]
(+ x y))
Clojure admite dos tipos de comentarios. Los comentarios de una sola línea van precedidos de ;, y la forma comment se usa para evitar la evaluación de todo lo que hay entre (comment y ).
En este ejercicio vas a escribir código para ayudarte a cocinar una lasaña espectacular sacada de tu libro de cocina favorito.
Tienes cuatro tareas, todas relacionadas con el tiempo que se tarda en cocinar la lasaña.
Define la variable expected-time para comprobar cuántos minutos debe estar la lasaña en el horno. Según el libro de cocina, el tiempo esperado en el horno es de 40 minutos:
expected-time
;;=> 40
Define la función remaining-time, que toma como argumento los minutos que la lasaña lleva ya en el horno y devuelve cuántos minutos tiene que seguir todavía en el horno, según el tiempo esperado en el horno de la tarea anterior.
(remaining-time 30)
;;=> 10
Define la función prep-time, que toma como argumento el número de capas que has añadido a la lasaña y devuelve cuántos minutos has tardado en prepararla, suponiendo que cada capa te lleva 2 minutos.
(prep-time 2)
;;=> 4
Define la función total-time, que toma dos argumentos: el primero es el número de capas que has añadido a la lasaña y el segundo es el número de minutos que la lasaña lleva en el horno. La función debe devolver cuántos minutos en total has dedicado a cocinar la lasaña, es decir, 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.
(total-time 3 20)
;;=> 26
Regístrate en Exercism para aprender y dominar Clojure con 12 conceptos105 ejercicios y mentoría humana real, todo gratis.