The earliest posts that I wrote on this blog related to my plan to create a functional programming language. Over the last few weeks, I have actually done that. It's nothing pretty, but it really does work, with lambda expressions and everything.
I worked backwards, starting with how the language would work on the inside, without worrying about what it would look like on the outside. The final language isn't finished yet, but I created a kind of intermediate testing language to use for checking the architecture.
The testing language is not supposed to be pretty. My main consideration here was to create a language that could be parsed by a very simple parser (with no lookahead), so that meant leaving out a lot of syntactic sugar and salt.
Here is my first program in the testing language.
using System using FBaseUnitTests let plus method Program _test006plus [ Int32 , Int32 ] let ifzero lazyMethod Program _test006ifzero [ Int32 , Int32 , Int32 ] let func lambda [ Int32 ] [ x ] apply variable ifzero [ variable x , value Int32 1 , apply variable plus [ variable x , apply variable func [ apply variable plus [ variable x , value Int32 -1 ] ] ] ] let r apply variable func [ value Int32 16 ]
The most important thing here is that functions are first-class citizens. The variables plus and ifzero hold native methods (one of which has some lazy parameters), while the variable func holds a lambda expression.