Clojure China

为什么time是一个宏?

#1

为什么time要做成一个宏呢?
这个不能用函数代替么?

   (defn time [expr]
       (let [start (System/nanoTime)
             result expr]
        {:result result :elapsed (- (System/nanoTime) start)}))
=> #'user/time
(user/time (str "a" "b" "c" "d" "e" "f" "g" "h"))
=> {:result "abcdefgh", :elapsed 19400}

也进行时间计算了啊。这个时间和用宏计算的时间有啥区别呢?

PS:运行了一下,确实两者区别的,自定义函数版本的不能准确的反映出执行时间
比如用自定义的函数和time分别对(Thread/sleep 1000)执行一下,自定义的计算出的时间极短.
上面的例子中的数字那么大,是因为我没有仔细读clojure自身的time还要将计算出的时间除以10^6
为什么时间会这么短呢?因为不用宏,expr传进来的是表达式计算的结果吧,不是表达式本身
一个表达式的结果确实不要啥时间。不知道这样理解是否正确。

#2

对,如果用函数的话,到‘result expr’ 的时候,expr 已经跑完了。

#3

因为time的输入是一个form