如何使一个函数在Clojure中最多执行N次另一个函数?

如何使一个函数在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

首先,我有一个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 (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)