SQL offre una funzione denominata coalesce(a, b, c, ...)
che restituisce null se tutti i suoi argomenti sono nulli, altrimenti restituisce il primo argomento non null.Clojure coalesce function
Come andresti a scrivere qualcosa del genere in Clojure?
Si chiamerà così: (coalesce f1 f2 f3 ...)
dove il fi
sono forme che dovrebbero essere valutati solo se necessario. Se f1
non è zero, non è necessario valutare f2
- potrebbe avere effetti collaterali.
Forse Clojure offre già una tale funzione (o macro).
EDIT: Ecco una soluzione che mi è venuta (modificata dalla programmazione di Stuart Halloway Clojure, (and ...)
macro a pagina 206):
(defmacro coalesce
([] nil)
([x] x)
([x & rest] `(let [c# ~x] (if c# c# (coalesce [email protected])))))
sembra funzionare.
(defmacro coalesce
([] nil)
([x] x)
([x & rest] `(let [c# ~x] (if (not (nil? c#)) c# (coalesce [email protected])))))
Risolto.
@ user128186: Non sono sicuro che sia necessario il '(non (nil? V #))' nell'istruzione '(if ...)', dal momento che tutto ciò che non è 'false' o' nil' viene valutato come 'true'. Altrimenti le nostre soluzioni sono le stesse. – Ralph
perché dovresti eseguire una riscrittura 1: 1 del "o" -macro? – nickik
@Ralph: Quindi prima non vuoi nil o il primo valore non falso? – Arjan