gpt4 book ai didi

clojure - 如何在 Clojure 中创建一个最多执行另一个函数 N 次的函数?

转载 作者:行者123 更新时间:2023-12-02 13:37:45 25 4
gpt4 key购买 nike

首先,我有一个像这样的Mysql表:


创建表 t (id int(11) PRIMARY KEY unsigned NOT NULL AUTO_INCRMENT, 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代码是错误的,因为repeat将评估do-something函数一次,然后构造惰性序列。

(defn take-times []
(some true? (repeat 5 (do-something))))

无论do-something返回什么,这个take-times2都会评估do-something 5次。

(defn take-times2 []
(some true? (for [i (range 5)]
(do-something))))

如果不使用递归函数和宏怎么办?

最佳答案

这应该有效:

(->> (repeatedly do-something)
(take 5)
(some true?))

更新(2014 年 11 月 4 日):

由于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

关于clojure - 如何在 Clojure 中创建一个最多执行另一个函数 N 次的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26658276/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com