首先,我有这样一个Mysql表:
create table t (id int(11) PRIMARY KEY unsigned NOT NULL AUTO_INCREMENT, name varchar(20), age int(10));
我定义了一个函数,它将在t中创建一行:
(require '[honeysql.core :as sql])
(defn do-something []
(sql/query {:insert-into :t
:values [{:name "name1" :age 10}]})
(> 3 (rand-int 5)))现在我想运行这个函数,直到它返回true,但最多是N次。
此take-times代码是错误的,因为重复将对do-something函数进行一次验证,然后构造延迟序列。
(defn take-times []
(some true? (repeat 5 (do-something))))无论take-times2返回什么,这个do-something都将运行5次。
(defn take-times2 []
(some true? (for [i (range 5)]
(do-something))))如果不使用递归函数和宏,该怎么办?
发布于 2014-10-30 16:50:49
这应该是可行的:
(->> (repeatedly do-something)
(take 5)
(some true?))更新(04.11.2014):
由于repeatedly实际上允许一个可选的长度参数,所以这也很好:
(some true? (repeatedly 5 do-something))示例
(defn do-something
[]
;; 20% chance of true
(let [ret (rand-nth [true false false false false])]
(prn 'hello ret)
ret))
(defn run
[]
(->> (repeatedly do-something)
(take 5)
(some true?)))
(run)
;; hello false
;; hello false
;; hello true
;; => true
(run)
;; hello false
;; hello false
;; hello false
;; hello false
;; hello false
;; => nil发布于 2014-10-30 17:59:17
该约简函数具有根据用户定义的标准停止处理序列的约简选项。
使用正误随机序列
(defn rand-seq [] (repeatedly #(rand-nth [true false false false false])))使用“约简”生成向量,直到找到真或达到最大虚值数为止。
(defn at-most-or-true [s max-false]
(reduce (fn [acc v]
(if (and (not v) (< (count acc) max-false))
(conj acc v)
(reduced acc)))
[] s))这可以通过调用
(at-most-or-true (rand-seq) 5)https://stackoverflow.com/questions/26658276
复制相似问题