Hello Anton, Thank you - that helps a lot.
I will try and build a recent development version of Gforth for my system and use recognizers. Recognizers would have been my preferred approach, I just did not know they were supported. Kind regards and thanks, Tristan On 01Apr22 13:18, Anton Ertl wrote: > On Fri, Apr 01, 2022 at 09:51:09AM +0100, Tristan Williams wrote: > > Hello, > > > > I am trying to extend gforth's outer interpreter so that how numbers > > are treated is dependent on which mode (indicated by the value of > > mode?) my program is in. In the code below, if mode? is true the > > number is just dropped, otherwise it should be treated as usual and > > placed on the host data stack. This seems to work if I type > > definitions in interactively at the terminal, but if I include them at > > the end of the source file or interactively using include "filename" > > it does not. What am I doing wrong? > > You hook into 'quit, which is only used for text-interpretation of > terminal input. > > If you use a recent development version of Gforth, the way to go is to > define a new number recognizer, and replace the default number > recognizer REC-NUM with the new one (or just insert the new one in > front of REC-NUM in the recognizer stack). The documentation is not > finished yet, but look at the source of REC-NUM, and use > GET-RECOGNIZERS and SET-RECOGNIZERS to change the recognizer stack. > > If you use Gforth-0.7, things are more complex: You need to replace > INTERPRETER1 and COMPILER1. These are not hooks, so you need to patch > the existing colon definitions. To do that, use: > > : >colon-body ( xt -- addr ) > dup @ docol: <> -12 and throw >body ; > > : >prim-code ( xt -- x ) > \ converts xt of a primitive into a form usable in the code of > \ colon definitions on the current engine > threading-method 0= IF @ THEN ; > > : replace-word ( xt1 xt2 -- ) \ gforth > \G make xt2 do xt1, both need to be colon definitions > swap >colon-body ['] branch >prim-code rot >colon-body 2! ; > > - anton >