Как добавить строки в вектор в Clojure - PullRequest
3 голосов
/ 22 июня 2019

Я новичок в Clojure и программировании функций в целом.

Я хочу выполнить набор if / else и, если условие истинно, я хочу добавить некоторую строку в список.

В JavaScript было бы так:

const a = 1;
const b = 2;
const c = 1;

const errors = [];

if (a !== b) {
  errors.push("A and B should not be different");
}

if (a == c) {
  errors.push("A and C should not be equal");
}

console.log(errors);

Как я могу сделать это с Clojure?

Ответы [ 2 ]

6 голосов
/ 22 июня 2019

cond-> подходит для условного изменения некоторого значения и объединения этих операций:

(def a 1)
(def b 2)
(def c 1)

(cond-> []
  (not= a b) (conj "A and B should not be different")
  (= a c) (conj "A and C should not be equal"))

Первый аргумент cond-> - это значение, которое должно быть пропущено через правосторонние формы; это пустой вектор здесь. Если ни одно из условий LHS не выполнено, он вернет этот пустой вектор. Для каждого выполненного условия оно вписывает векторное значение в форму RHS, которая здесь conj для добавления элементов в вектор.

Проверьте макросы -> и ->> для других примеров потоков.

1 голос
/ 24 июня 2019

cond-> это хорошо, но я бы предпочел создать вспомогательную функцию, чтобы она выглядела более декларативно:

(defn validation-messages [& data]
  (keep (fn [[check v]] (when (check) v)) data))

(validation-messages
 [#(not= a b) "A and B should not be different"]
 [#(= a c) "A and C should not be equal"])

;;=> ("A and B should not be different" "A and C should not be equal")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...