SQL предлагает функцию с именем coalesce(a, b, c, ...)
, которая возвращает значение null, если все его аргументы равны нулю, в противном случае он возвращает первый ненулевой аргумент.Clojure coalesce function
Как вы собираетесь писать что-то подобное в Clojure?
Он будет называться так: (coalesce f1 f2 f3 ...)
где fi
являются формами , которые должны быть оценены только в случае необходимости. Если f1
не равен нулю, то f2
не следует оценивать - он может иметь побочные эффекты.
Возможно, Clojure уже предлагает такую функцию (или макрос).
EDIT: Вот решение, которое я придумал (редактировался программирования Стюарта Халлоуэй в Clojure, (and ...)
макросъемки на странице 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])))))
Исправлено.
@ user128186: Не уверен, что вам нужно '(not (nil? V #))' в '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' неправильно. В противном случае наши решения будут одинаковыми. – Ralph
Зачем вам делать переписку 1: 1 из «или» -макро? – nickik
@Ralph: Значит, вы хотите, чтобы сначала не ноль или первое не ложное значение? – Arjan