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