
- todo
    - interpreter
        - overloaded functions
        - garbage collection
    - compiler
        - generate C code
        - optimize code
        - monads
        - pattern matching
            - (x, y) = foo;            ==>  q = foo; x = first q; y = second q;
            - function (x, y) -> foo;  ==>  function q -> let x = first q; y = second q; in foo;
        - functional type system
        - native functions
        - exception handling

---------
- Grammer
---------

    terminal :
        symbol
        number
        string
        [ list ]
        ( expression )
        function args -> expression
        let definitions in expression
        if expression then expression else expression

    member :
        terminal
        member . terminal

    multiply :
        member
        multiply * member

    addition :
        multiply
        addition + multiply

    apply : addition apply

    pair :
        apply
        apply , pair

    list :
        pair
        pair :: list

    expression : list

    definition :
        symbol = expression
        symbol args = expression
