I was testing the use of [] inside a definition, I got an error:
: x [ here ] ;
:2: unstructured
: x [ here ] >>>;<<<
I understand that the cause of the error is having grown/decreased the stack while compiling. The culprit can be any "immediate" word:
: y + ; immediate ok
1 2 y . 3 ok
4 5 ok
: x y ;
:4: unstructured
: x y >>>;<<<
My question is: is it part of the standard or just the gforth implementation?
Are there any other restrictions on the use of the stack?
It is a part of the standard.
The word
:leaves colon-sys on the data stack:( -- colon-sys ).The word
;consumes colon-sys from the data stack:( colon-sys -- ).colon-sys is a system-compilation data type. The size of colon-sys is implementation dependent. It can occupy 0 cells in the data stack, or ten cells, or more.
The following line, when run with the empty data stack, will output the colon-sys tuple.
In turn, the word
;throws an exception if it does not encounter colon-sys at the top of the stack (for example, if you put something on the stack over colon-sys). Throwing exception in this case is not obligated, but allowed by the standard due to an ambiguous condition.Therefor, doing compilation of a definition, it's not easy to consume something from the data stack or leave something on the stack. You can use variables, or a user-defined stack, or, if creating a definition programmatically, the return stack.
Formally, colon-sys is placed on the control-flow stack. But the control-flow stack may be implemented using the data stack. Anyway, the result is that colon-sys may occupy 0 or more data stack cells.