Skip to content

A very compact functional programming language for .NET.

License

Notifications You must be signed in to change notification settings

hfoffani/hypolambda

Repository files navigation

HypoLambda

A very compact functional programming language for .NET.

Its syntax is based on Python, but whitespaces are ignored. Everything is an expression. The language runtime is embeddable, its AST is accessible, and it compiles to portable pcode. There's a REPL you can play with, and the project includes lots of unit tests.

Why?

Though I do not recommend using it to develop full applications, it's very appropriate as a template or customization language for a .NET application.

HL has a tiny footprint which lets you embed it in any kind of .NET project including mobile ones.

Example

Calculate a factorial:

f = lambda x:
    (x*f(x-1)) if x > 1 else 1;
f(4)

returns 24.0

Closures are supported:

add = (lambda: (
    counter = 2;
    lambda: (counter = counter + 1)
))();
add();
add()

returns 4.0. The () in the fourth line creates the closure.

Run HL within a .NET program and interact with it:

var exp = new HypoLambda();
exp.Externals["A"] = "a";
exp.Compile("A * 3");
var result = exp.Run()

result contains "aaa".

How do I get set up?

The easiest way is to add HypoLambda to your .NET project using Nuget.

If you want to try a console build HypoLambda:

  • You will need Visual Studio. You can use the Community Editions (either from Microsoft or Xamarin).
  • Check out the repository.
  • Open the solution with Visual Studio.
  • The IDE should download all the necessary components.
  • Compile and run the tests.
  • Run the console application.

You can build and run the tests in OSX or Linux using the Makefile in the command line shell although the tests fails to run from the Makefile.

Grammar

expression :=   single_exp ( ";" single_exp )*

terminal   :=   var_name | number | string | list

list       :=   "[" ( terminal ("," terminal)* ) "]"

single_exp :=   terminal
            |   "(" expression ")"
            |   var_name = single_exp
            |   lambda_exp "(" single_exp ("," single_exp)* ")"
            |   condition
            |   single_exp "*" single_exp
            |   single_exp "/" single_exp
            |   single_exp "+" single_exp
            |   single_exp "-" single_exp
            |   single_exp "if" condition "else" single_exp

condition  :=   single_exp
            |   condition "and" condition
            |   condition "or" condition
            |   "not" condition
            |   single_exp ">" single_exp
            |   single_exp ">=" single_exp
            |   single_exp "<" single_exp
            |   single_exp "<=" single_exp
            |   single_exp "==" single_exp
            |   single_exp "!=" single_exp

lambda_exp :=   "lambda" ( "(" var_name ("," var_name)* ")" ) ":" single_exp

Future work

For HL to take on serious tasks it will need to support:

  • Add objects or dictionaries or maybe namespaces?
  • Include comments in the code.
  • Implement tail recursion.
  • Apply tail recursion to loops.

Asynchronous evaluations

Provide an async keyword that transforms a lambda expression into a promise. The fulfillment of the future value would be implicit and blocking delayed until the actual value is required.

a_function = lambda x: x + 2;
a_promise = async a_function;
future_val = a_promise(3);
...
result = future_val + 5

Other planned features

  • Compressed (or binary) pcode.
  • Restricted execution environment. (CPU, Memory and I/O)
  • Rewrite the parser as shift-reduce.

Of course, I'm open to suggestions...

License

This project is published under the Apache License.

Contributions

I gratefully honor Pull Requests. Please, consider formatting the code with K&R style and four spaces tabs.

Who do I talk to?

For questions or requests post an issue here or tweet me at @herchu

About

A very compact functional programming language for .NET.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published