Arbitrary computations at compile time are not necessarily a bad thing. LISP had the advantage that regular code and data were notated and stored the same way, so writing macros to shovel code around was no harder than writing functions to shovel data around. Importantly, the language for the macros was the same as the language itself. The loop macro link you provided is a bad example; overall, LISP did macros right.
C++ templates are a byzantine language that shares nothing at all in common with C++ itself, which is fine if you're not trying to build a turing machine out of them. I want a C-based language with LISP-like macros so bad, but template metaprogramming has always seemed like an abuse to me. Code that convoluted could not have been intended.