Forums before death by AOL, social media and spammers... "We can't have nice things"
|    comp.lang.forth    |    Forth programmers eat a lot of Bratwurst    |    117,927 messages    |
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
|    Message 117,130 of 117,927    |
|    Gerry Jackson to Anton Ertl    |
|    Efficient implementation of Finite State    |
|    07 Mar 25 12:23:46    |
      From: do-not-use@swldwa.uk              On 06/03/2025 18:09, Anton Ertl wrote:       > mhx@iae.nl (mhx) writes:       >> However, a state machine has well defined rules based on a       >> state's stored information and its inputs, causing it to go to       >> another well-defined state while generating outputs. In that       >> context a goto is harmless and merely serves as a crutch when       >> there are not enough computing nodes to serve all states in       >> parallel. How to make such an efficient crutch in Forth?       >       > You lost me. Why would one "serve all states in parallel"?       >       > Anyway, if the question is how to implement a state machine       > efficiently in Forth, one answer is to stay at a higher, more       > structured level of abstraction or recreate it from the state machine.       > E.g., don't transform a regular expression into a (indeterministic or       > deterministic) finite state machine, but instead interpret it directly       > (that's what Bernd Paysan's regexp.fs does). Or instead of       > transforming a grammar into a push-down automaton, transform it into a       > structured Forth program (like Gray does).       >       > If you cannot do that, in standard Forth you don't really have good       > options. The best is probably to have the current state on the stack       > (probably in the form of the address of an array indexed with the       > input (or whatever causes a state change) and containing the potential       > next states at the appropriate elements.       >       > In a particular implementation, you can do more, including goto-like       > things. What I would do then is have a colon definition per state,       > and do the transition to the next state as tail call. Have some       > efficient forward-tail-call mechanism to allow calling states where       > the definition comes later. Gforth has a clever FORWARD, but for now       > that does not do tail-calls.       >       > - anton              About a year ago I wanted a finite state machine and thought that the       Julian Noble approach was rather slow, so I developed a different       approach that I haven't seen elsewhere. This method defines a state of       the FSM as a wordlist that contains an action including a test, (a       :noname definition), and a VALUE that holds the execution token of the       state's action/test.              A simple example that demonstrates the principle is given below, it       implements the Michael Gassanenko example that selects integers that can       be divided by 6. See       https://groups.google.com/g/comp.lang.forth/c/iHCT2IaqxSA/m/85IUu0GSBwAJ       for another implementation. An FSM for the /6 example is not the best       solution for the example but is simply used to demonstrate the principle.              Use of a wordlist, whose wid is held in an immediate constant, enables       easy linkage between states at compile time, eg a typical state action       in outline is:              :noname |
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
(c) 1994, bbs@darkrealms.ca