Timer clojure中的人工时间实现

Timer clojure中的人工时间实现,timer,clojure,Timer,Clojure,我知道在编写clojure时,远离状态通常是个好主意。然而,在我看来,时间是一种非常有状态的东西 我的目标是在我用clojure写的游戏中代表时间。我的想法是将计时器作为一个单独的进程运行,并在需要时读取其值,但在clojure中似乎没有任何自然的方式来实现这一点 您如何在clojure中的简单角色扮演游戏中实现时间?我已将中的代码改编为日期dif函数: (defn date-dif [d1 d2] (let [tu java.util.concurrent.TimeUnit/SECONDS

我知道在编写clojure时,远离状态通常是个好主意。然而,在我看来,时间是一种非常有状态的东西

我的目标是在我用clojure写的游戏中代表时间。我的想法是将计时器作为一个单独的进程运行,并在需要时读取其值,但在clojure中似乎没有任何自然的方式来实现这一点


您如何在clojure中的简单角色扮演游戏中实现时间?

我已将中的代码改编为日期dif函数:

(defn date-dif [d1 d2]
  (let [tu java.util.concurrent.TimeUnit/SECONDS
        t1 (. d1 getTime)
        t2 (. d2 getTime)]
    (. tu convert (- t2 t1) java.util.concurrent.TimeUnit/MILLISECONDS)))

(defn start-timer []
  (let [cur-time (new java.util.Date)]
    (fn [] (date-dif cur-time (new java.util.Date)))))
start timer
将创建并返回一个函数,该函数在调用时返回自函数创建以来的秒数。要使用它,请执行以下操作:

rpg-time.core> (def my-timer (start-timer))
#'rpg-time.core/my-timer
rpg-time.core> (my-timer)
3
rpg-time.core> (my-timer)
5
rpg-time.core> (my-timer)
6
如果您想要不同的时间单位,而不是秒,请将秒替换为更合适的时间单位


当然还有其他的选择。这只是我想到的第一个,编码或使用并不困难。

我已经将中的代码改编为我的日期dif函数:

(defn date-dif [d1 d2]
  (let [tu java.util.concurrent.TimeUnit/SECONDS
        t1 (. d1 getTime)
        t2 (. d2 getTime)]
    (. tu convert (- t2 t1) java.util.concurrent.TimeUnit/MILLISECONDS)))

(defn start-timer []
  (let [cur-time (new java.util.Date)]
    (fn [] (date-dif cur-time (new java.util.Date)))))
start timer
将创建并返回一个函数,该函数在调用时返回自函数创建以来的秒数。要使用它,请执行以下操作:

rpg-time.core> (def my-timer (start-timer))
#'rpg-time.core/my-timer
rpg-time.core> (my-timer)
3
rpg-time.core> (my-timer)
5
rpg-time.core> (my-timer)
6
如果您想要不同的时间单位,而不是秒,请将秒替换为更合适的时间单位


当然还有其他的选择。这只是我想到的第一个,编写或使用它并不困难。

计时器是非常无状态的。实际上,计时器是它启动的时间点

为了简单起见,我将在这里使用

(require '[clj-time.core :as t]
         '[clj-time.coerce :as c])

(defn timer
  []
  (let [now-sec #(-> (t/now) c/to-long (/ 1000) int)
        start (now-sec)]
    #(- (now-sec) start)))

(def my-timer (timer))
;; after a second
(my-timer)
;;=> 1
;; and after 2 seconds more
(my-timer)
;;=> 3

计时器是非常无状态的。实际上,计时器是它启动的时间点

为了简单起见,我将在这里使用

(require '[clj-time.core :as t]
         '[clj-time.coerce :as c])

(defn timer
  []
  (let [now-sec #(-> (t/now) c/to-long (/ 1000) int)
        start (now-sec)]
    #(- (now-sec) start)))

(def my-timer (timer))
;; after a second
(my-timer)
;;=> 1
;; and after 2 seconds more
(my-timer)
;;=> 3

我不认为在这种情况下你需要保持一种状态。只要得到你开始的时间,那么这只是减去当前时间的问题。“开始的时间”是一种状态。我认为在这种情况下你不需要保持状态。只要得到你开始的时间,那么这只是减去当前时间的问题。“开始的时间”是一种状态。当计时器需要记住它开始的时间时,你怎么能说它是无状态的?@WolfeFan它是无状态的,因为它没有任何可变状态,但是这个词的用法可能不正确。这是错误的,
timer
函数现在在
t/now
上触及全局状态,当计时器需要记住它启动的时间时,你怎么能说它是无状态的呢?@WolfeFan它是无状态的,因为它没有任何可变状态,但是这个词的用法可能不正确。这是错误的,
timer
函数正在
t/now