Babel is an exercise to understand expressive type systems. The goal is to build an expressive, call by value programming language which does not have a runtime system.
- Keep the language/compiler simple
- Keep semantics clear
- Be as UNORIGINAL as possible
- static typing
- parametric polymorphism
- type inference
- value restriction
- monomorphization
- C based ABI
- C interoperability
- Records
- constrained parametric polymorphism (type classes)
- affine types
- references
- pattern matching
- functors
- metaprgramming
- Mutually recursive functions that are not at the top level. In theory we can do dependency analysis o detect mutual recursion and then group the mutually recursive functions. Creating the groups can reorder side effects and so is not safe to do in an impure language.
- Type constructors and expr applications have arity this is to allow uncurrying to work.