To answer this question I think that it is important to look at the similarities between the languages:
- Both LFE and Elixir have the explicit goal to be compatible with vanilla erlang in the sense that you can freely mix code written in any dialect. So, for example, it is problem free to write behaviour code in LFE/Elixir and use it together with all of OTP. This allows LFE/Elixir code to be used as components of larger systems written in vanilla erlang.
- Both LFE and Elixir support the same datatypes as vanilla erlang. Seeing they both run on top of erlang it is not possible for them to create new datatypes.
- Both LFE and Elixir compile down to the same code as vanilla erlang generates. Elixir does this by compiling to vanilla erlang while LFE compiles down to Core erlang which is an internal language in the compiler. This means that there is no performance penalty in using either LFE or Elixir.
There are of course differences as well:
- LFE is very true to how vanilla erlang handles datatypes while Elixir has made some changes to which types are "standard". So LFE still has strings as lists of characters while Elixir has strings as binaries by default.
- Elixir has done some work in improving the interfaces to some standard libraries while LFE uses the standard libraries "straight".
- While Elixir has a much improved macro handling it is still limited by only allowing its predefined syntax. LFE as a lisp has no predefined syntax only lists so macros can be, and often are, used to define new syntax. LFE uses macros to implement records.
So in one sense you can say that there is no real need for either LFE or Elixir at the lowest level they can only do what vanilla erlang can do. But many people feel they can do it in a much better way.
In the end it probably boils down to which syntax you prefer: the lisp syntax of LFE or the Rubish syntax of Elixir. Personally, I am a lover of parentheses.
Robert