if-let et when-let

Il arrive souvent en Clojure de vouloir vérifier si une valeur est par exemple non égale à nil, et que si c'est le cas utiliser cette valeur pour la suite du programme.

Par exemple, nous pourrions écrire le code suivant pour vérifier si une clé est présente dans une map, et si oui imprimer sa valeur:

(def my-map {:foo "bar"})

(if (:foo my-map)
  (println (:foo my-map))
  (println "the key does not exists"))

Rappelez vous qu'en Clojure, une map retourne nil si on demande une valeur associée à une clé n'existant pas, et nil vaut faux dans un if.

Le code précédent fonctionne, mais peut être raccourci grâce à if-let:


(def my-map {:foo "bar"})

(if-let [value (:foo my-map)]
  (println value)
  (println "the key does not exists"))

if-let commence comme let avec une déclaration de variable, mais un if est également réalisé: si la variable est évaluée comme fausse, on exécute la première form, sinon la seconde.

when-let est exactement la même chose que if-let pour when.

Précédent - Suivant -

(def my-map {:foo "bar"})

(if-let [value (:foo my-map)]
  (println "if-let: the key exists : " value "\n")
  (println "if-let: the key does not exists \n"))

(if-let [value (:bar my-map)]
  (println "if-let: the key exists : " value "\n")
  (println "if-let: the key does not exists \n"))

(when-let [value (:foo my-map)]
  (println "when-let: the key exists : " value)
  (println "when-let: you can have multiple expressions in when-let, like in when \n"))

powered by mcorbin - Available on Github