Clojure функция / макрос для применения функций, пока один не вернет что-то отличное от nil - PullRequest
0 голосов
/ 02 апреля 2020

В настоящее время у меня есть некоторый код, подобный этому:

(defn compute-issue [some args] (or (age-issue some args) (name-issue some args)))

Будут и другие типы проблем. Есть ли что-то вроде этого:

(defn compute-issue [some args] (first-not-nil [age-issue name-issue] some args))
; Where first-not-nil would be something like
(defn first-not-nil [fs & args]
  (if (empty? fs)
    nil
    (let [result (apply (first fs) args)]
      (if (nil? result)
        (recur (rest fs) args)
        result))))

Я новичок в Clojure. Я заново изобретаю существующую функцию?

1 Ответ

1 голос
/ 02 апреля 2020

Существует похожая функция some-fn в clojure.core:

Принимает набор предикатов и возвращает функцию f, которая возвращает первое логическое значение true значение , возвращаемое одним из его составных предикатов против любого из его аргументов, иначе оно возвращает логическое ложное значение. Обратите внимание, что f является коротким замыканием в том смысле, что оно остановит выполнение первого аргумента, который запускает логический истинный результат по сравнению с исходными предикатами.

Ключевые различия: some-fn возвращает другую функцию для фактического приложение-функция, и эта функция также отбрасывает false результатов, что может показаться нежелательным. Это еще один простой способ сформулировать это:

(defn first-not-nil [fs & args]
  (first
   (for [f fs
         :let [r (apply f args)]
         :when (some? r)]
     r)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...