SQL предлагает функцию с именем coalesce(a, b, c, ...)
, которая возвращает значение null, если все его аргументы равны нулю, в противном случае он возвращает первый непустой аргумент.
Как бы вы писали что-то вроде этого в Clojure?
Он будет вызываться следующим образом: (coalesce f1 f2 f3 ...)
, где fi
являются формами , которые должны оцениваться только при необходимости. Если f1
не равно nil, то f2
не следует оценивать - это может иметь побочные эффекты.
Возможно, Clojure уже предлагает такую функцию (или макрос).
РЕДАКТИРОВАТЬ: вот решение, с которым я столкнулся (изменено с помощью программирования Stuart Halloway Programming Clojure, (and ...)
macro на стр. 206):
(defmacro coalesce
([] nil)
([x] x)
([x & rest] `(let [c# ~x] (if c# c# (coalesce [email protected])))))
Кажется, работает.
(defmacro coalesce
([] nil)
([x] x)
([x & rest] `(let [c# ~x] (if (not (nil? c#)) c# (coalesce [email protected])))))
Фиксированный.