Rex asked about this in the thread about best practices. I think this deserves its own topic.
In Pick-based MV platforms the EQUATE statement is a compiler directive. Whatever is found in the EQUATE is baked into the object code.
This means we don't want to use something like @USER or @(0,23), as in:
EQU THIS.USER TO @USER
EQU ERR.LINE TO @(0,23)
or
EQU VAR1 TO 1
EQU VAR2 TO VAR1+1
D3 won't even compile that because the values are expressions rather than literals. If it did evaluate the expressions, the value for THIS.USER would be TG, and for ERR.LINE, VT100-specific escape sequences would get baked into the object. That is not the desired effect at runtime when another user on WY-60 gets screen output. That used to happen.
In other platforms, and I don't recall which except maybe for Universe? EQUATE is still a compiler directive. But it replaces the literal values into the code at compile time, not the evaluated expression. So with the above code CRT THIS.USER would be compiled as CRT @USER, which would then return the correct run-time value.
I'll be happy to accept embarrassment of citing old behaviours, but equally happy to learn specifically how each platform does this.
I'd also be happy to see a D3 enhancement, where rather than flagging THIS.USER TO @USER as a compile-time error, they generate the symbol table and then substitute the literal text @USER for all THIS.USER symbols, without evaluating it.
Corrections and good/current info is greatly appreciated.
T