+# minfp: a minimal pure lazy functional language
+
+`minfp` is a functional programming language that aims to be as small as
+possible while still being feature rich.
+Most of the code is taken up by type checking.
+
+```
+$ wc -l *.[id]cl
+ 23 ast.dcl
+ 25 ast.icl
+ 5 builtin.dcl
+ 13 builtin.icl
+ 12 check.dcl
+ 168 check.icl
+ 6 gen.dcl
+ 39 gen.icl
+ 7 int.dcl
+ 49 int.icl
+ 59 main.icl
+ 10 parse.dcl
+ 124 parse.icl
+ 13 scc.dcl
+ 41 scc.icl
+ 594 total
+```
+
+### Features
+
+- Polymorphic type inference for the Hindley-Milner type system
+- Support for let polymorfism
+- Reasonable interpreter
+
+### CFG
+
+```
+minfp := function+
+function := (op+ ['infixr' | 'infixl'] digit+ | id) id* '=' expr ';'
+expr := expr op expr
+ | '\' id '.' expr
+ | '(' op+ ')'
+ | '\' id '.' expr
+ | '-'? digit*
+ | 'True' | 'False'
+ | 'code' id
+ | id
+id := alpha (alnum)*
+op := '!' | '|' | '@' | '#' | '$' | '%' | '^' | '&' | '*' | '=' | '+'
+ | '/' | '?' | '-' | '_' | '|' | ''' | '"' | '\' | ''' | '<' | '>'
+ | '.' | ':'
+alpha := a | b | .. | z | A | B | .. | Z
+digit := 0 | 1 | .. | 9
+alnum := alpha | digit
+```
+
+A program always has to have a `start` function that takes no arguments.
+
+### Code instructions
+
+See `builtin.icl` for all builtin instructions that you can use with `code`
+
+### Todo
+
+- Code generation
+- ADTs