我使用這個基本的宏作爲構建塊其它的定時宏:簡單的宏似乎不執行給定的形式
(defmacro time-pure
"Evaluates expr and returns the time it took.
Modified the native time macro to return the time taken."
[expr]
`(let [start# (current-nano-timestamp)
ret# ~expr]
(/ (double (- (current-nano-timestamp) start#)) 1000000.0)))
我測試過這一點,並在其它宏使用過,所以我知道它工作正常。
可以通過下面的代碼片段來說明我的問題:
(defmacro time-each [& exprs]
`(mapv #(time-pure %) '~exprs))
我希望它可以給每個表達time-each
,在那裏執行和時間它;返回結果。然而,當我測試了一下,瞬間完成:
(time-each
(Thread/sleep 500)
(Thread/sleep 1000))
[0.036571 0.0]
我很困惑這個,因爲我知道,(time-pure (Thread/sleep 1000))
將花費大約一秒鐘返回,而這一切的宏觀它委託給time-pure
。
這是什麼造成的?我真的不知道如何正確調試一個宏。我用macro-expand-1
檢查生成的代碼:
(clojure.pprint/pprint
(macroexpand-1
'(time-each
(Thread/sleep 500)
(Thread/sleep 1000))))
(clojure.core/mapv
(fn*
[p1__1451__1452__auto__]
(helpers.general-helpers/time-pure p1__1451__1452__auto__))
'((Thread/sleep 500) (Thread/sleep 1000)))
但沒有真正站出來給我。
這是怎麼回事?
(注意,這是一個問題,我發佈了幾分鐘前,我意識到,我展示了令人費解的情況下的欺騙,所以我做了一個更好的例子。)
你想讓我把另一個連接到這個嗎? –
@ArthurUlfeldt呃,我把它刪除了,所以只有非常高級的用戶才能看到它。除了使用的代碼之外,它基本相同。回想起來,我可能應該編輯原文。我不確定爲什麼我提出了一個新問題。 – Carcigenicate