I used to all kinds of syntax or absence of it, like in Lisp or Forth. So I have no problem with Erlang syntax itself, but with its verbosity and inconsistency.<p>1. Versbosity<p>Sorted by code verbosity level, Erlang is somewhere in between Java/C++/C# (more verbose) and Ruby/Python (less verbose). But closer to dynamic languages, since you don't need to specify the types.<p>OTP code is significantly more verbose than plain Erlang and adds some boilerplate code (which can be generated for you by tools, like emacs or rebar, but you still need to read it and maintain it).<p>When you adding dialyzer specs, code become even more verbose. Since you need to duplicate function and argument names in the specs. Even worse - you need to duplicate dialyzer specs in edoc specs, since edoc uses it's own specs.<p>You can write your own macros and parse-transforms to reduce verbosity, but they aren't 1st class citizens and will not work from shell.<p>Given said all that, you still can expect up to 1:10 SLOCs reduction, comparing to C++ or Java, for large real life distributed applications.<p>2. Inconsistency<p>Example of inconsistency:<p><pre><code> proplists:get_value(Key,Proplist)
dict:fetch(Key, Dict)
dict:find(Key, Dict)
gb_trees:get(Key, Tree)
gb_trees:lookup(Key, Tree)
ets:lookup(Tab, Key)
dets:lookup(Tab, Key)
element(Index,Tuple)
lists:nth(Index,List)
array:get(Index,Array)
</code></pre>
All this can be written in modern languages as:<p><pre><code> Data[Key]
Data[Index]</code></pre>