Four years ago somebody posted a comment-thread describing how you could start writing a little reverse-polish calculator, in C, and slowly improve it until you had written a minimal FORTH-like system:
At the time I read that comment I'd just hacked up a simple FORTH REPL of my own, in Perl, and I said "thanks for posting". I was recently reminded of this discussion, and decided to work through the process.
Using only minimal outside resources the recipe worked as expected!
The end-result is I have a working FORTH-lite, or FORTH-like, interpreter written in around 2000 lines of golang! Features include:
- Reverse-Polish mathematical operations.
 - Comments between 
(and)are ignored, as expected.- Single-line comments 
\to the end of the line are also supported. 
 - Single-line comments 
 - Support for floating-point numbers (anything that will fit inside a 
float64). - Support for printing the top-most stack element (
., orprint). - Support for outputting ASCII characters (
emit). - Support for outputting strings (
." Hello, World "). - Support for basic stack operations (
drop,dup,over,swap) - Support for loops, via 
do/loop. - Support for conditional-execution, via 
if,else, andthen. - Load any files specified on the command-line
- If no arguments are included run the REPL
 
 - A standard library is loaded, from the present directory, if it is present.
 
To give a flavour here we define a word called star which just outputs a single start-character:
: star 42 emit ;
Now we can call that (NOTE: We didn't add a newline here, so the REPL prompt follows it, that's expected):
> star
*>
To make it more useful we define the word "stars" which shows N stars:
> : stars dup 0 > if 0 do star loop else drop then ;
> 0 stars
> 1 stars
*> 2 stars
**> 10 stars
**********>
This example uses both if to test that the parameter on the stack was greater than zero, as well as do/loop to handle the repetition.
Finally we use that to draw a box:
> : squares 0 do over stars cr loop ;
> 4 squares
****
****
****
****
> 10 squares
**********
**********
**********
**********
**********
**********
**********
**********
**********
**********
For fun we allow decompiling the words too:
> #words 0 do dup dump loop
..
Word 'square'
 0: dup
 1: *
Word 'cube'
 0: dup
 1: square
 2: *
Word '1+'
 0: store 1.000000
 2: +
Word 'test_hot'
  0: store 0.000000
  2: >
  3: if
  4: [cond-jmp 7.000000]
  6: hot
  7: then
..
Anyway if that is at all interesting feel free to take a peak.  There's a bit of hackery there to avoid the use of return-stacks, etc.   Compared to gforth this is actually more featureful in some areas:
- I allow you to use conditionals in the REPL - outside a word-definition.
 - I allow you to use loops in the REPL - outside a word-definition.
 
Find the code here:
Tags: forth, github, go, golang, hackernews No comments