20/12/2016 : Oforth V0.9.26 released

One more release is needed before V1.0. See change log and Oforth manual.

24/09/2016 : Oforth V0.9.25 released

This releases is the last before Oforth V1.0. Some features are now obsolete. See change log and Oforth manual.

23/07/2016 : Oforth V0.9.24.1 released

Minor bugs fixed and some optimizations on native code generator.

24/05/2016 : Oforth V0.9.23 released

Warning : this version introduces lots of internal changes. Some of those changes can make previous Oforth code not compatible with this version. This is probably the last major version before V1.0 and teh las one that introduce such evolutions.

The biggest change is now that most Oforth words are now written in Oforth. These words are declared into 2 new files that are loaded at startup : asm.of and prelude.of .
Core words are now written in Oforth into those files.

The second big change is the modification of the order of parameters declaration for words. This makes existing words defined with two or more parameters not compatible with this Oforth version (or, at least, they must be controlled). Example for the new order :

: t(a, b) a b - ;
10 4 t .
6 ok
t(10, 4) .
6 ok

The last big change is for { and }. They are now dedicated to JSON objects. Use of classical : and ; for definitions is now mandatory.

And to finish, some words have been added. See lang package documentation for more information.

EDIT 07/02/2016 : V0.9.23.1 released to fix 2 bugs (oforth luanch from outside install directory and output on Mac OS X).

- Franck -

26/09/2015 : Oforth V0.9.22 released

This version adds an incremental garbage collector feature. GC is no more a "stop the world" phase and tasks are allowed to run between GC steps.
GC steps are about 100 microseconds.
A new documentation has been added for memory and garbage collector informations here

This version also allows the interpreter to read classical Forth definition syntax. Tutorials will be updated to follow this notation. For instance :

: fact(n) -- n1
| i | 1 n loop: i [ i * ] ;

- Franck -

27/07/2015 : Oforth V0.9.21

Oforth V0.9.21 release available
This version adds support to namespaces. Complete ChangeLog is here
A new tutorial has been added for packages and namespaces here

- Franck -

26/05/2015 : Oforth V0.9.20

Oforth V0.9.20 release available
This version adds support to Mac OS X. Complete ChangeLog is here

- Franck -

01/03/2015 : Oforth V0.9.17

Oforth V0.9.17 release is available.
Complete ChangeLog is here
Complete lang package reference added to documentation here

- Franck -

31/01/2015 : Oforth V0.9.16

Oforth V0.9.16 release is available.
Complete ChangeLog is here

- Franck -

25/01/2015 : Oforth is on rosetta code

Oforth V0.9.16 is coming soon with a redesign of internal parallelism.
In the meantime, Oforth page has been created on Rosetta Code with many examples.
If you want to add some tasks not implemented, it's here.

- Franck -

01/12/2014 : Oforth V0.9.15

Debugging options have been added.
For x86 processors, minimum requirement is now Pentium 4.
Complete ChangeLog is here

- Franck -

16/11/2014 : Oforth V0.9.14 - First Linux release

Linux x86 32b platform has been added.
Complete ChangeLog is here

- Franck -

05/11/2014 : Oforth V0.9.12 - First release

It's time for the first Oforth release for Windows x86 32 bits plateforms. Oforth is not production ready yet, but this version is rather stable. It can be downloaded here. We are currently working on a Linux version for x86 processors and on 64 bits versions.
Have fun...

- Franck -

Some examples (from tutorials).

You can find lots of examples here


: fact(n) n 0 == ifTrue: [ 1 ] else: [ n fact(n 1 -) * ] ;

Fibonacci sequence

: fib(n) 0 1 n #[ tuck + ] times drop ;

Look and say (see detail)

: lookAndSay(n) [ 1 ] #[ dup println group map([#size, #first]) ] times(n) ;

Sum of square roots of all even integers between 1 and 10000

seq(10000) filter(#isEven) map(#sqrt) sum println 333383.040171148

A ping pong between 2 tasks running concurrently and using channels to communicate

: pong(n, ch1, ch2) | i | n loop: i [ ch2 send(ch1 receive) drop ] ;

: pingpong(n)
| ch1 ch2 i |

   Channel new ->ch1
   Channel new ->ch2
   #[ pong(n, ch1, ch2) ] &
   n loop: i [ ch1 send(i) drop ch2 receive println ] ;

An emitter that launches event listeners into parallel tasks running concurrently

: myemitter {
| e |
   Emitter new(null) ->e
   e onEventParallel($foo, #[ "foo" println ])
   e emit($foo)
   e onEventParallel($foo, #[ "bar" println ])
   e emit($foo)
   e close ;