SQL ofrece una función llamada coalesce(a, b, c, ...)
que devuelve null si todos sus argumentos son nulos, de lo contrario, devuelve el primer argumento no nulo.Clojure coalesce function
¿Cómo harías para escribir algo así en Clojure?
Se llamará así: (coalesce f1 f2 f3 ...)
donde el fi
son formas que sólo se deben evaluar si se requiere. Si f1
no es nulo, entonces no se debe evaluar f2
, puede tener efectos secundarios.
Quizás Clojure ya ofrezca dicha función (o macro).
EDITAR: Aquí una solución que se me ocurrió (modificado de Programación de Stuart Halloway Clojure, (and ...)
macro en la página 206):
(defmacro coalesce
([] nil)
([x] x)
([x & rest] `(let [c# ~x] (if c# c# (coalesce [email protected])))))
parece funcionar.
(defmacro coalesce
([] nil)
([x] x)
([x & rest] `(let [c# ~x] (if (not (nil? c#)) c# (coalesce [email protected])))))
Fijo.
@ user128186: No estoy seguro de que necesite el '(not (nil? V #))' en la declaración '(if ...)', ya que cualquier cosa que no sea 'false' o' nil' se evalúa como 'true'. De lo contrario, nuestras soluciones son las mismas. – Ralph
¿por qué harías una reescritura 1: 1 del "o" -macro? – nickik
@Ralph: ¿Entonces quieres primero el valor nulo o el primero no falso? – Arjan