Forth is basically at the level of an assembly language, but somehow it feels much more high-level and flexible. Having written a bunch of x86 and some Forth, I would say Forth is more pleasant to use once you’ve gotten over the small initial hump of stack-based programming. And anyway, if you write your functions correctly, the stack becomes an implementation detail. It definitely affects your thinking in higher-level languages, though—naming bits of state ends up seeming way less necessary than naming and composing behaviours.
I’m writing a statically typed functional stack-based language called Kitten, in which the type system and local variables help you work compositionally and avoid managing the stack. It’s not yet ready for prime time, but you might be interested in following its development. Check it out!
One thing I love about Forth is that the Forth assembler is implemented in the same spirit as the Forth compiler, which is to say that it's fully integrated and programmable and extensible in Forth! So it has much more than a "macro" facility -- you can write full-fledged Forth assembly macros that assemble any code you like programmatically! And write your own assembler flow control constructs, and stuff like that!
I’m writing a statically typed functional stack-based language called Kitten, in which the type system and local variables help you work compositionally and avoid managing the stack. It’s not yet ready for prime time, but you might be interested in following its development. Check it out!
[1]: http://github.com/evincarofautumn/kitten
[2]: http://kittenlang.org/