Find a file
2020-05-09 10:47:47 -04:00
sallyforth Fairly complete rewrite of VM. Now supports composite words with { w1 w2...}. Rewrote :, if, ifelse and while to use composite words. Namespaces now have Clojure like vars for indirection and also support inline words. Words defined in Python now use Python function decorators to add Sallyforth related metadata. 2020-05-09 10:47:47 -04:00
.gitignore Initial commit 2020-04-14 12:06:48 -04:00
LICENSE Initial commit 2020-04-14 12:06:48 -04:00
README.md Formatting fix. 2020-05-02 11:11:14 -04:00

SallyForth: A simple Forth-like language implemented in Python.

SallyForth is a simple hobby implementation of a FORTH-like programming language. Possibly the most interesting thing about SallyForth is the name, which Michael Nygard suggested as a name for a FORTH implementation at exactly the same time that I happened to be writing this code.

Running SallyForth

SallyForth is writting in Python 3 and will happily run with either the standard C Python implementation or Pypy. To run SallyForth just kick off the sallyforth.py file:

$ python sallyforth/sallyforth.py

The Sally Language

Like FORTH, Sally is a stack oriented concatenative programming language. What this means is that any constant value in a sallyforth program, like a number or a string:

sallySh> "Hello, world!"

Has the effect of pushing the value onto an ever present data stack. There are also commands or functions -- called words -- that you can use to do things.

So the word p will pop the value off of the top of the stack and print it:

sallySh> "Hello, world!"
sallySh> p
Hello, world!

Sally parsing is about as simple as you can get: words and constant values are separated by whitespace. So if you wanted to print a number of values, you could do this:

sallySh> 1 2 3 p p p
3
2
1

The only execeptions to the separated by whitespace rule are double quoted strings, which work about the way you would expect:

sallySh> "I can have spaces in my string"
sallySh> p
I can have spaces in my string

Sally comes prepackaged with a host of useful words, everything from basic arithmetic:

sallySh> 1 2 + p
3
sallySh> 10 10 * 1 + p
101

To boolean logic:

sallySh> true false and p
False
sallySh> false true or p
True

To IO:

sallySh> "hello.txt" read-file
sallySh> p
This is the contents of hello.txt.
Use it wisely.

You can also define your own words. A word defintion starts with a colon, followed by the name of your new word, followed by the contents of your new word, followed by a semicolon. Keep in mind that everything -- including the colon and semicolon, needs to be set off with whitespace:

: hello-world "Hello, world!" p ;

Once your new word is defined you can use it like any other word:

sallySh> hello-world
Hello, world!