> I can just as easily split comptime into
In Rust, generics, macros, traits, compile-time evaluation are different constructs with drastically different syntax (and generics and value generics are different features, implemented at different times, but I can accept them as a single construct).
> It has no way to constrain a comptime type argument (traits)
It does: introspection, just as Clojure can constrain arguments, only Zig does it at compile time.
> so you get error messages like C++ templates
You don't because in C++ templates are programmed in their own sub-language with SFINAE tricks (at least in the C++ versions I use; they've probably added new ways to do this, as they do). In Zig, it's just Zig computation. You'd get similar compile-time errors as you would get, at runtime, in, say, Clojure or Python.
> When you want to combine things, you manage phase ordering and idioms by hand, basically re-implementing Rust-like concepts at every use site.
You don't need to reimplement things by hand at every use site; you just call a subroutine at compile time.
> Sometimes one or two more concepts in the language makes things simpler.
I agree, but I think that Zig's comptime brings revolutionary simplicity to the very complex subject of partial evaluation which is so important in systems languages. How well it would work in practice remains to be seen, and I may well be disappointed, but I find Zig's approach of simplicity first very appealing. I agree it's a matter of taste.