I’m also so glad this is being highlighted. Even though ZIL is older than pretty much any other IF tool, its macro system is truly unmatched. No other compiler on the market (as far as I know) lets you mess with the fundamental structure of the language like this, building things like “here’s how you declare an object” or “here’s how you declare a property” in the language itself.
I7 lets you define new relations, TADS lets you mess with the code at runtime, Dialog lets you build your own parser…but to the best of my knowledge, not a single one of them would let you construct something as fundamental as an “if” statement or a “for” loop within the language itself. Even outside the IF world, that sort of power is mostly restricted to LISP and its descendants.
The result is that ZIL projects can offload a whole lot of work to the compiler—which historically ran on a much more powerful computer than the compiled games did—without tweaking the compiler itself.
(I suspect this is how the route-finding works in Suspended—using macros to build the routes at compile-time instead of runtime—but I don’t understand the ZIL source well enough to be sure. But some trickery must have been involved to let GO TO ALPHA FC happen in seconds back in 1983.)