Выдает исключение, потому что msg - это список,
говорят, что вы вызываете его,
(time (+ 1 1) "asd")
msg в макросе становится вызовом функции ("asd"), который завершается неудачно,Просто деструктурируйте msg,
[expr & [msg]]
и используйте
~msg
Вы также можете проверить, как макросы расширяются с помощью macroexpand,
(macroexpand '(time (+ 1 1) "asd"))
Также пара точек,
- время уже в ядре
- ваша версия принимает и умножает только одно выражение.
РЕДАКТИРОВАТЬ: время с необязательным сообщением,
(defmacro time
"Evaluates expr and prints the time it took. Returns the value of
expr."
{:added "1.0"}
[expr & [msg]]
(let [msg (if (nil? msg) "" msg)]
`(let [start# (. System (nanoTime))
ret# ~expr]
(prn (str "Elapsed time: " (/ (double (- (. System (nanoTime)) start#)) 1000000.0) " msecs. " ~msg))
ret#)))
(time (+ 1 1))
"Elapsed time: 0.068 msecs. "
2
(time (+ 1 1) "asd")
"Elapsed time: 0.067 msecs. asd"
2