Digest #85 2019-10-02
Contributions
referenceImplementation - Reference implementation of SYNONYM
The existing reference implementation is broken (it produces STATE-smart words). Here's a one that works (in recent Gforth snapshots):
: s-to ( val nt -- )
>body @ (to) ;
opt: ( xt -- )
?fold-to >body @ ]] literal (to) [[ ;
: s-defer@ ( xt1 -- xt2 )
>body @ defer@ ;
opt: ( xt -- )
?fold-to >body @ ]] literal defer@ [[ ;
defer synonym-prototype
[: >body @ compile, ;] set-optimizer
[: >body @ name>interpret ;] set->int
[: >body @ name>compile ;] set->comp
' s-to set-to
' s-defer@ set-defer@
: synonym ( "name" "oldname" -- )
``synonym-prototype create-from
?parse-name find-name dup 0= -13 and throw
dup compile-only? if compile-only then
, reveal ;
This implementation obviously uses a lot of system-specific stuff (you can read about that in "The new Gforth Header" in the EuroForth 2019 proceedings), but in general, system-specific stuff is necessary for implementing SYNONYM.
This SYNONYM not only implements inheritance of interpretation and compilation semantics, but almost everything else: That a word can have TO, DEFER@, or DEFER! applied to it, as well as its code generator. Things that a synonym defined with the SYNONYM above does not inherit are the nt (they are necessarily different in order for NAME>STRING to work), and you cannot apply DOES> or any of the SET-... words to the SYNONYM of a word and have it affect the original (for most SET-... words, this produces the expected result, but for DOES> and SET-DOES>, it does not).
t{ synonym my-+ + -> }t
t{ 1 2 my-+ -> 3 }t
t{ 1 2 ' my-+ ]execute[ -> 3 }t
t{ : comp-my+ postpone my-+ ; -> }t
t{ : ya-+ [ comp-my+ ] ; -> }t
t{ 1 2 ya-+ -> 3 }t
These test cases fail with the existing reference implementation (showing that this implementation is incorrect), and succeeds with the proposed reference implementation.
Replies
Committee response
This was discussed at the standards meeting. Our conclusions are
We can't vote on this until it is a proper proposal, which should include common practice
The committee felt that the proposal is unlikely to pass
The code is simple to implement, and is more of a "Wouldn't It Be Nice If" than satisfying a real need.
Stephen Pelc