Комбинируя if-let с OR, чтобы функции могли выполняться несколько раз на одном значении - PullRequest
0 голосов
/ 02 января 2019

То, чего я пытаюсь добиться, - это выполнять функции над значением несколько раз, когда выполняются несколько условий. В частности, скажем, у нас есть две переменные a и b.

Когда a равно true, значение преобразуется функцией, связанной с a, тогда когда b равно true, новое значение преобразуется функцией, связанной с b.

Таким образом, когда начальное значение равно 0, а функции inc и #(+ 5 %), мы можем получить 0, 1, 5 или 6.

Мой подход был следующим, но безуспешно

user> (def initial-number 0)
user> (if-let [a true b true] (cond-> initial-number a inc b (#(+ 5 %))))
IllegalArgumentException clojure.core/if-let requires exactly 2 forms in binding vector in user:  clojure.core/if-let (core.clj:1758)
user>

1 Ответ

0 голосов
/ 02 января 2019

Код, который вы используете, будет работать, как описано, если вы замените if-let на let. Вся ваша условная логика существует в cond->.

(def initial-number 0)

(let [a true  b true]  (cond-> initial-number a inc b (#(+ 5 %)))) => 6
(let [a false b true]  (cond-> initial-number a inc b (#(+ 5 %)))) => 5
(let [a true  b false] (cond-> initial-number a inc b (#(+ 5 %)))) => 1
(let [a false b false] (cond-> initial-number a inc b (#(+ 5 %)))) => 0
...