4 ms·
> Erlang already is a more concise language than Elixir but also noisier as there are more punctuation characters. What? Here's more-or-less the entirety of E
by dmitriid 6y ago
> Erlang already is a more concise language than Elixir but also noisier as there are more punctuation characters.
What?
Here's more-or-less the entirety of Erlang's "noisier syntax with more punctuation characters"
-spec f(A :: any(), B :: some_type(), C :: list()) -> any().
f(A, {B}, [C | _]) ->
A1 = fun() -> io:format(a, []) end,
A1(),
case C of
<<1, _/binary>> -> 1;
_ -> #person{ok = ok, field = C}
end.
Edit:
%% plus map syntax
#{"tuple" => {1,2}}
M#{"key" := "new_value"}
%% plus list comprehensions
[X || X <- List, X /= 10].
Elixir has all that plus more. The equivalent in Elixir is something along the lines of
@spec f(a :: any(), b :: some_type(), c :: list()) :: any()
def f(a, {b}, [c | _]) ->
a1 = fun() -> IO.inspect(a) end,
a1.(),
case C do
<<1, _ :: binary>> -> 1
_ -> %Person{ok: :ok, field: c}
end
end
## and don't forget the capture and pipe syntax
x |> (&f(y, {&1}, list)).()
## and default function parameters
def f(a, b, c \\ []), do: something()
## and sigils
String.replace(str, ~r".*", "")
## and Ecto adds its own characters
id = 1
(from p in Person, where: p.id == ^id, select: p) |> Repo.all()
## and dropping down to Erlang is a function call on an atom
:io.format(x, y)
And I'm definitely forgetting more...
Edit:
## and string interpolation
a = 1
s = "The value is: #{a}"
## and two different map syntaxes
%{a: :map, with: "various", keys: "as", atoms: 0}
%{"another" => "map", "but" => "keys", "are" => "strings"}
## and different map access
map[key]
map.key
## and map update
%{ map | key: "new_value" }
## and list comprehensions
for x <- list, x != 10 do
end
- dnautics 6y agoyou are conviently forgetting one thing: The equivalent of "hello world" in erlang is <<"hello world">> Not the best. Keyword lists in erlang are unpretty m:f(value, [{foo, <<"bar">>}, {baz, 47}]) Where in elixir you would do: :m.f(value, foo: "bar", baz: 47)
- dmitriid 6y ago> The equivalent of "hello world" in erlang is is "hello world". Edit: I know that "" in Elixir is binaries which are <<>> in Erlang. In Erlang "hello world" is really a list of ["h", "e", "l", "l", ...]. What was surprising to me is how rarely that matters (unless you actually do a lot of text processing). And the functions that matter (like I/O) deal with io_lists anyway. And since strings in Elixir are binaries, when you actually need to work with binaries, you're back to the same/similar syntax: <<0:1, 0:1, 1:1, 1:1>> == <<3:4>> %% Erlang <<0::1, 0::1, 1::1, 1::1>> == <<3::4>> ## Elixir > Keyword lists in erlang are unpretty Keyword lists in Elixir are nice, that's true.
- literallyWTF 6y agoMy god, it’s like Perl but somehow worse. How do you even keep track of what’s going on?
- astrowilson 6y agoThat’s not a representative example of none of the languages. It is also just plain invalid for Elixir. I recommend checking actual code examples on their websites to form a better opinion.
- dmitriid 6y agoIt's not that bad, really. As with most languages, syntax is the easy part. From personal experience: - You're comfortable with Erlang syntax within half a day. There's just so much less of it - You're comfortable with Elixir syntax within a day of two of active coding. Function captures may trip you up once or twice more, but then it's fine.
- astrowilson 6y agoYour Elixir example is literally wrong. It won’t compile unless you do many changes. You are keeping -> instead do. You are still using commas after each expression. The fn syntax is wrong and also using parens for args. So you forgot to remove most of the punctuation noise. You are conveniently not showing many examples where Elixir is considerably less noisier such as keywords, utf-8 binary strings, etc. Module definitions in Erlang use -(). while Elixir doesn’t use a single punctuation character. Erlang has special syntax for list and binary comprehensions while Elixir has unified both and uses no special syntax. Maps in Erlang also have two syntaxes, more ways of doing try/catch, etc. If you take examples of actual code implemented in both languages, instead of cherry-picked invalid gibberish, you will find that Erlang has more punctuation per character than Elixir.
- dmitriid 6y ago> Your Elixir example is literally wrong. It won’t compile unless you do many changes. I was typing this inside the HN comment box. And no, not many changes. > So you forgot to remove most of the punctuation noise For the two examples you could come up with for my entire text Elixir adds half a dozen new punctuation characters on top of Erlang. > If you take examples of actual code Of course. Here you go: Enum.sort(["some", "kind", "of", "monster"], &(byte_size(&1) < byte_size(&2))) I mean, Erlang doesn't even have `&` as a part of syntax, but sure, "Erlang has more punctuation". Besides, Erlang's syntax is significantly more consistent than Elixir's. Just take Elixir's two separate syntaxes for maps, for example. Or the dichotomy between syntax for functions and lambdas (both for declaration and invocation). The only reason Elixir feels like it has less punctuation is that Erlang is actually more terse than Elixir. Just having pipes and function captures everywhere makes Elixir code have more punctuation than Erlang.
- astrowilson 6y agoThe example that you picked and wrote translates to this in Erlang: lists:sort( fun(X, Y) -> byte_size(X) < byte_size(Y) end, [<<"some">>, <<"kind">>, <<"of">>, <<"monster">>] ). I will let others decide which one is noisier. (And no, using Erlang strings here is not the same, especially when popular libraries like Hackney and Cowboy work only with binary strings) > Erlang is actually more terse than Elixir Which was my point since the beginning but you quoted only part of my reply. It is clear Elixir has more syntax than Erlang. The function definition delimiters (->/.) vs (do/end) is a good example in itself of how Erlang is more compact and using punctuation. I stand with my position that if you take actual code, a file or a project, and write it in both idiomatic Erlang and Elixir, Erlang will have more punctuation per character and will feel noisier. Here is an actual example. I got the hex decoding/encoding code recently committed to OTP in Erlang (https://pastebin.com/qMtj8mSY https://pastebin.com/qMtj8mSY) and rewrote to Elixir (https://pastebin.com/zUCLeXZG https://pastebin.com/zUCLeXZG). I ran them through the Whatsapp formatter and the Elixir formatter respectively. Both snippets compile and define proper modules. If you remove all whitespace, the rate of punctuation character per alphanumeric character for Erlang is 35%. For Elixir it is 25%. And FWIW, in this particular case, the Elixir implementation has roughly the same amount of characters as the Erlang one: 718 vs 721. I will be glad to continue this discussion if you want to use actual code instead of fictional examples. EDIT: I fixed an error in the Erlang snippet and updated the stats.