将 "if-let" 与 "OR" 相结合,因此函数可以针对一个值执行多次
Combining "if-let" with "OR" so functions may be executed several times on one value
我想要实现的是在满足多个条件时多次对一个值执行函数。特别是说我们有两个变量 a 和 b.
当 a 为真时,值由与 a 关联的函数转换,然后
当 b 为真时,新值由与 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>
如果将 let
替换为 if-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
我想要实现的是在满足多个条件时多次对一个值执行函数。特别是说我们有两个变量 a 和 b.
当 a 为真时,值由与 a 关联的函数转换,然后 当 b 为真时,新值由与 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>
如果将 let
替换为 if-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