如何使一个函数在Clojure中最多执行N次另一个函数?
首先,我有一个Mysql表,如下所示:如何使一个函数在Clojure中最多执行N次另一个函数?,clojure,Clojure,首先,我有一个Mysql表,如下所示: 创建表t(id int(11)主键无符号非空自动增量,名称varchar(20),年龄int(10)); 我定义了一个函数,它将在t中创建一行: (require '[honeysql.core :as sql]) (defn do-something [] (sql/query {:insert-into :t :values [{:name "name1" :age 10}]}) (> 3
创建表t(id int(11)主键无符号非空自动增量,名称varchar(20),年龄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次
此花费时间
代码是错误的,因为repeat将对做某事
函数进行一次评估,然后构造延迟序列
(defn take-times []
(some true? (repeat 5 (do-something))))
此执行时间2
将评估执行某项操作
5次,无论执行某项操作
返回什么
(defn take-times2 []
(some true? (for [i (range 5)]
(do-something))))
如果我不使用递归函数和宏,该怎么办 这应该有效:
(->> (repeatedly do-something)
(take 5)
(some true?))
更新(2014年11月4日):
由于反复
实际上允许一个可选的长度参数,这也很好:
(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
reduce函数具有reduced选项,用于根据用户定义的条件停止处理序列 使用真与假的随机序列
(defn rand-seq [] (repeatedly #(rand-nth [true false false false false])))
使用reduce构建向量,直到找到真值或达到假值的最大数目
(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))
这可以通过数字累加器
(fn[n v](如果(或v(>=acc max false))(减少的v)(inc acc))来简化
以0作为初始条件噢,使用reduce的方式意味着truthy值永远不会返回EDI并不认为这段代码做了任何有用的事情。这是一个可以使用sql插入等进行重做的示例。使用数字累加器的第一条注释是一个更好的示例。
(at-most-or-true (rand-seq) 5)