Sorry if I felt rude in any response, it was not the intention. I really didn’t understand your point at first, that’s why I was using your own question to make my conclusions. But now I get it was kind of a rhetorical question.
I think your point is very interesting anyways, and I’ve really never thought about this. You really helped me to come to the conclusion I came, so thank you for playing devil’s advocate.
I thought Elixir is the only homioiconic language that doesn’t use S-expressions (e.g. Lisps). But then I read that article and Red and Julia also have this property. I think every language and platform competes on a set of features and capabilities.
Each of these features exists elsewhere (most come from Erlang), but no where else do you have them all together:
Dynamically typed with static analysis
Hygenic macros with a regular syntax
Pre-emptible green threads
Concurrent garbage collection via shared-nothing heaps
Process linking and supervision trees
Modern build tools and package ecosystem, markdown comments etc.
Turns out, this is a pretty useful feature set to write web and server applications.
Elixir is not homioiconic. It’s AST does not directly match the syntax and the syntax does not directly match the AST. There are valid AST’s that have no syntax equivalent, thus making Elixir non-homioiconic.
I think it is properly called a feature. It may not appeal to everyone but it was definitely an intentional design decision and it does appeal to some people. Personally I find dynamic typing wearysome at times and I’m in a better mood and feel more productive when I code in Haskell all day rather than Elixir, but Elixir hits a lot of other buttons for me and pays the bills. Sometimes - despite my feelings in the moment - I think I am actually more productive in Elixir, because I do not find myself endlessly refining abstractions the way I do in languages with a sophisticated type system. I just get shit done.