Translate

viernes, 12 de marzo de 2021

Primeros pasos con Clojure, parte 29

Seguimos con Clojure... 


cond es una serie de condiciones y expresiones. Cada condición se evalúa en orden y la expresión se evalúa y devuelve el resultado de la primera expresión en que condición fue verdadera.

(let [x 5]

  (cond

    (< x 2) "x is less than 2"

    (< x 10) "x is less than 10"))


Si no se cumple ninguna condición, se devuelve nil. Un modismo común es usar una condición final de :else. Las palabras clave (como :else) siempre se evalúan como verdaderas, por lo que siempre se seleccionará de forma predeterminada.


(let [x 11]

  (cond

    (< x 2)  "x is less than 2"

    (< x 10) "x is less than 10"

    :else  "x is greater than or equal to 10"))


case compara un argumento con una serie de valores para encontrar una coincidencia. ¡Esto se hace en tiempo constante (no lineal)! Sin embargo, cada valor debe ser un literal en tiempo de compilación (números, cadenas, palabras clave, etc.).

A diferencia de cond, case arrojará una excepción si ningún valor coincide.

user=> (defn foo [x]

         (case x

           5 "x is 5"

           10 "x is 10"))

#'user/foo


user=> (foo 10)

x is 10


user=> (foo 11)

IllegalArgumentException No matching clause: 11


case puede tener una expresión final que se evaluará si ninguna prueba coincide.


user=> (defn foo [x]

         (case x

           5 "x is 5"

           10 "x is 10"

           "x isn't 5 or 10"))

#'user/foo


user=> (foo 11)

x isn't 5 or 10