FWIW, I think the `let a=..; let b=..` is fine if even if it introduces copies. Optimizing seems out of scope for asserts - you really optimize by just not running them. :-) As @jackhftang correctly observed, asserts are not a replacement for logging.
Not sure a more capable `binOpAssert` or `powAssert` are "too much" for the stdlib. I like big tent/all of the above stdlibs, but priorities vary widely and we've had a hard time growing Nim's stdlib. As a reader, I would prefer (for `powAssert`) an output format like "condition that failed" then "subexpression components"..basically failure then explanation outside-in..basically the reverse of @Hlaaftana's - that way I can maybe stop reading earlier. (I know some people read errors bottom-up...Just registering an opinion).