(defmacro bad-idea-double [x] `(+ ~x ~x))
(println (bad-idea-double 5))
(println "Let's see what happens when we use bad-idea-double with side-effects")
(println (bad-idea-double (do (println "A) doing side effects") 3)))
; How many times will "A) doing side effects" print?
(defmacro right-way-double [x] `(let [x-val# ~x] (+ x-val# x-val#)))
(println (right-way-double (do (println "B) doing side effects") 4)))
; How many times will "B) doing side effects" print?
KGRlZm1hY3JvIGJhZC1pZGVhLWRvdWJsZSBbeF0gYCgrIH54IH54KSkKCihwcmludGxuIChiYWQtaWRlYS1kb3VibGUgNSkpCgoocHJpbnRsbiAiTGV0J3Mgc2VlIHdoYXQgaGFwcGVucyB3aGVuIHdlIHVzZSBiYWQtaWRlYS1kb3VibGUgd2l0aCBzaWRlLWVmZmVjdHMiKQoKKHByaW50bG4gKGJhZC1pZGVhLWRvdWJsZSAoZG8gKHByaW50bG4gIkEpIGRvaW5nIHNpZGUgZWZmZWN0cyIpIDMpKSkKOyBIb3cgbWFueSB0aW1lcyB3aWxsICJBKSBkb2luZyBzaWRlIGVmZmVjdHMiIHByaW50PwoKKGRlZm1hY3JvIHJpZ2h0LXdheS1kb3VibGUgW3hdIGAobGV0IFt4LXZhbCMgfnhdICgrIHgtdmFsIyB4LXZhbCMpKSkKCihwcmludGxuIChyaWdodC13YXktZG91YmxlIChkbyAocHJpbnRsbiAiQikgZG9pbmcgc2lkZSBlZmZlY3RzIikgNCkpKQo7IEhvdyBtYW55IHRpbWVzIHdpbGwgIkIpIGRvaW5nIHNpZGUgZWZmZWN0cyIgcHJpbnQ/Cg==