Solving the Go Challenge 1 in Erlang
medium.com
medium.com
I think the the particular problem (which by the way was super fun, great work @mattetti!) was really well suited for pattern matching, so like OP I gravitated towards those tools.
I had been keeping my solution private until the contest was over on the 28th, but for sake of comparison of Elixir/Erlang idiomatic code (which should be pretty similar), I'll make my repo public now too (which also contains my Go solution):
https://github.com/mroth/golang-challenge-1
BTW, if you enjoy playing around with reverse engineering, I recommend NOT looking at any of these solutions, and doing the challenge yourself first (in whatever language you want). It was amongst the best of the "code challenge exercises" I've attempted.
You want your tools to feel like that.
https://github.com/jlouis/go-challenge-1
If you need a LICENSE, I can slam a MIT or Apache 2.0 on it for you, but...
Are there any good books on this subject?
Thanks.
http://jlouisramblings.blogspot.com/2013/01/how-erlang-does-...
BTW, this is the author of the program and the article!
Heck checkout out all his posts, they are fantastic.
Here is my quick try at it:
Try to think of Erlang VM as a mini operating system. Erlang processes are then OS processes.
If your operating system is modern it lets you launch more processes than you have CPUs.
Also if one process crashes it doesn't affect others. This is pretty cool and useful. Anyone remember how much fun it was to run Windows 3.1 or Windows 95? Your game crashes and your word processor got screwed as well as a side effect. That is pretty primitive. We got better tools than that (Linux, Windows, etc). So this takes you a long way as far as the analogy works. Erlang processes have the same properties.
The only difference is that while you can probably have hundreds or maybe thousands OS processes on a large system, you can have many hundreds of thousands or even millions of Erlang processes. They are really lightweight (a couple of KB of memory only when they start up). The VM is a really awesome piece of engineering because it makes it all possible while also preserving isolated heaps (memory).
IIRC, it pattern match first and if the variable is not assign then it'll assign it IIRC. The code and explanation just state that it's Erlang to do assertion.
I think that's an interesting concept at least when I play with Erlang.
It's more closed than it is open.
> It has been solid and running large, reliable, industrial system for many years.
Did I say otherwise?
> What do you want Ericsson to bake a cake for you?
Yes.
> It is open source (https://github.com/erlang/otp), some have forked it and updated as needed (for example WhatsApp).
I know it is open source. I have contributed to it.
> There is a bug mailing list (http://erlang.org/pipermail/erlang-bugs/),
Presumably you bring this up because I pointed out there is not a public bug tracker. A mailing list is not a substitue for a bug tracker.
> there are regular bug fixes, pull requests, frequent releases. New features added (like maps).
Yes, and? Where do I go to see the status of, I don't know, native processes? (Assuming that's still being worked on.) How about a list of bugs in the ssh or ssl apps? (This is not an esoteric thing: http://erlang.org/pipermail/erlang-questions/2015-March/0837...)
Lastly, I'd ask you to consider what your response has done to improve and grow the Erlang community.
Yes you did, you said "It's let me down". I just assumed t was something more serious like major design flaw, or periodic segfaults in the runtime, and not "bugs go in the mailing list" vs "no Github issues".
> > What do you want Ericsson to bake a cake for you?
> Yes.
And they will. Throw in a couple of millions their way in there and they'll take a few engineers off from building their product and you might get a delicious cake.
> > There is a bug mailing list (http://erlang.org/pipermail/erlang-bugs/),
> Presumably you bring this up because I pointed out there is not a public bug tracker. A mailing list is not a substitue for a bug tracker.
It is not but they are the ones who pay their developers to work on this and they have a bug mailing list. You can still issue pull requests if you want. There are plenty here:
https://github.com/erlang/otp/pulls
File the bug, submit a patch and discuss there. Some pull requests have 20+ comments.
> there are regular bug fixes, pull requests, frequent releases. New features added (like maps).
Yes, and? And it is not exactly a "throw over the wall. It is like getting a free car from someone but complaining that the seats are the wrong color.And the car has now failed you.
> Where do I go to see the status of, I don't know, native processes?
Ask on the mailing list. Comment on the pull request or go on #erlang on IRC.
> Lastly, I'd ask you to consider what your response has done to improve and grow the Erlang community.
But what has your response done to hurt it? Here someone shared a cool project, and someone else commented how cool it is. And you are complaining that it is a "throw over the all" and it is a failure because they didn't set up Github issues properly. If you are going to spread fud then, well, be prepared to get nasty comments back.
If you have a large number of processes, then it is a problem. And do note that Erlang programs have way more pointer-redirections than a typical array-like approach which is common in Go and other imperative languages. That is the memory pressure by default will be higher than what you can achieve in languages with static types.
It tends to be a problem for tight computational kernels, and Erlang programmers usually fall down to C if they prove to become bottlenecks.
I have an older post here describing the schedulers: http://jlouisramblings.blogspot.dk/2013/01/how-erlang-does-s... which is still reasonably up-to-date to give the overview.
It was shorter in LOC than my go version, mainly due to try!, but the lines themselves were longer. The one difference in correctness was that I forgot to close the files in Go, but RAII took care of it automatically in Rust.
I love the looks of Rust because it's C ABI compatible and I could write Python libraries with it.
Erlang because it looks to be the best thing going for webservices, which is much of my work.
Erlang/Elixir is made to build fault-tolerant applications: think a service (which is really tens of thousands of micro-services all running in the Erlang VM), distributed on a cluster, that needs to run 24/7 without any interruption ever. Upgrading the app should not halt the system. A bug somewhere should not require you to restart the app: it should be limited in scope and you just hot patch it away. Erlang is fault tolerance is fault tolerance.
From a Python/SQL background both will have a different set of challenges to learn: Erlang/Elixir means learning functional programming (no for loops, all map/reduce/filter and recursion), while Rust means learning how to handle references/memory ownership.
To build webservices I'd give an edge to Elixir: cowboy + plug (+ phoenix). But that should be fun to build with Rust too... You should learn both :)
> state( "Magic", { consume(16), toString(), assert("SPLICE") } ),
> state( "Length", { consume( 1), fromOrd(), cropInput() } ),
> state( "Version", { consume(32), toString(), setVersion() } ),
> state( "Tempo", { consume( 4), fromFloat(), setTempo() }),
> state( "Instruments", { exhaust([snip]) } ),
The layout, from my abortive attempt to write a parser.http://en.wikipedia.org/wiki/Single-precision_floating-point...
A fun problem!