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 usando def:
(def fingers 10)
fingers
;;=> 10
Puedes usar defn para definir una función que toma cero o más argumentos. Esta es una función que sumaría 2 números:
(defn add [x y]
(+ x y))
Esta función toma 2 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 que devuelve siempre es el resultado de evaluar la última expresión del cuerpo, (+ x y). Esta expresión es una lista que representa una llamada a función. El primer elemento de la lista es la función +, que se evalúa usando los siguientes elementos, x y y, como argumentos.
La función add definida arriba se llama de la misma manera:
(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 ningún significado aparte del de dar formato.
Las funciones y las vars de Clojure se organizan en espacios de nombres. Un espacio de nombres agrupa funcionalidad relacionada y se define usando 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 por ; 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 algo de código para ayudarte a cocinar una lasaña espectacular de tu libro de cocina favorito.
Tienes cuatro tareas, todas relacionadas con el tiempo que se dedica a 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 recibe como argumento los minutos que la lasaña lleva realmente en el horno y devuelve cuántos minutos le quedan todavía por estar 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 recibe como argumento la cantidad de capas que le agregaste a la lasaña y devuelve cuántos minutos tardaste en prepararla, suponiendo que cada capa te toma 2 minutos de preparación.
(prep-time 2)
;;=> 4
Define la función total-time, que recibe dos argumentos: el primero es la cantidad de capas que le agregaste a la lasaña y el segundo es la cantidad de minutos que la lasaña lleva en el horno. La función debe devolver cuántos minutos en total llevas trabajando en 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.