首先,我有一个像这样的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次do-something
。
(defn take-times2 []
(some true? (for [i (range 5)]
(do-something))))
如果我不使用递归函数和宏该怎么办?
这应该工作:
(->> (repeatedly do-something)
(take 5)
(some true?))
更新(04.11.2014):
由于repeatedly
实际上允许使用可选的length参数,因此也可以:
(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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句