Tried to add recursions by utilizing Haskell's laziness but failed. It
seems like to make it work we can't actually examine the computed value.
So to use recursion, we either have to stick with Y combinator (which
could be slow), or we have to add mutation to the language and desugar
recursive definitions to a bind-mutate process.