Overview
This language has a syntax like OCaml/F#. It uses strict evaluation by default, but also supports lazy evaluation. The type system is based off of Complete and Easy Bidirectional Typechecking for Higher-Rank Polymorphism. This language is indentation sensitive.
Installation and Running
Run the following the project directory:
make
The bidir
executable will be placed in /usr/local/bin/
.
You can run a file with strict evaluation (the default), or lazy evaluation
by specifying the -l
flag.
bidir <filename>
bidir -l <filename>
Language
Let
let
expressions expect an expression on the right hand side and a body
expression (in
) that is aligned directly under the let
keyword.
let fiftyFour = 54
fiftyFour
If Else
if
else
expressions must contain a condition expression of type bool, on the
same line as the if
keyword. The then
branch must be indented on the next
line more than the if
keyword. The else
keyword must be aligned to the same
column as the if
keyword and it's branch expression must be indented more than
the if
keyword.
if eq 4 4
True
else
False
Functions
Functions are curried and may be written in a number of ways. The body expression
must be on the same line, or indented more than the let
keyword on a subsequent
line. Functions are introduced using the fun
keyword or by adding arguments to
a let
assignment.
let add a b =
add a b
let add = fun a b -> add a b
let add = fun a -> fun b -> add a b
Recursive functions are introduced by using the rec
keyword as follows.
rec factorial x =
if x = 1
1
else
x * factorial (x - 1)
Haskell $
Operator
Parentheses may be avoided by using the $
operator.
let add1 a = a + 1
add1 $ 4 + 5