 (defmacro report
   [body]
   `(let [result# ~body]
-     (println (expension-report ~body) "is" result#)
+     (println (expension-report ~body) "=>" result#)
      ))
+
+(defmacro constexpr
+  [fct & args]
+  (eval `(~fct ~@args)))
 
 ;; --------------------------------------------------------
 ;; Example 1: equivalent with constexpr


;; --------------------------------------------------------
;; Example 3-b: repeat a side-effectful call N times
;; --------------------------------------------------------

(defmacro times

;; Example 4-a: Adding logs around functions
;; --------------------------------------------------------

(defmacro defn-log
  [name bindings body]
  `(defn ~name
     ~bindings
     (println "Entering the function with args:" ~@bindings)
     ~body))

(defn-log add-log
  [a b]
  (+ a b))

(defn test-add-log
  []
  (add-log 1 2))

;; --------------------------------------------------------
;; Example 4-b: Adding logs based on run time option (no overhead)
;; --------------------------------------------------------

;; TODO

;; --------------------------------------------------------
