Fetching contributors…
Cannot retrieve contributors at this time
161 lines (98 sloc) 4.52 KB
post
How To Write Elixir Code: The Advanced Method
2014-08-19 01:55:47 -0400
true
elixir

Just in case: The following is a work of loving parody. Maybe satire? Maybe just having fun. Ya know I love ya guys and gals, right?

##1. State Its Purpose

I want to write a program to generate even numbers.

(For the purposes of this tutorial, I'm choosing a ridiculously simple purpose, one so simple that it's already solved by the core of the language itself. Just work with me here.)

##2. Write a Test with ExUnit

`    assert Number.is_even(0) == true`

I looked it up on Wikipedia to be sure this was true. Then I tested it in ExUnit to make sure it passed. Only THEN did I show you this test as if I was so confident it would work because I knew in advance that 0 is considered even.

If you have a problem with that, I invite you to look deep inside yourself and define "truthy" out loud with a straight face.

This is computer programming. We're paid to make stuff up as we go along with utter confidence that Stack Overflow was right.

##3. Write the Code to Pass the Test

``````defmodule Number do

def is_even(0), do: true

end
``````

Computer programming has gone so high level that any fifth grader could do this stuff after a day in MineCraft...

##4. Repeat 2 and 3 As Often As Possible to Complete What Step 1 Asks for

Bonus points for using guard clauses or recursion. I got one of those two in here.

```defmodule NumbersTest do
use ExUnit.Case

test "Even Numbers Check" do
assert Number.is_even(0) == true
assert Number.is_even(1) == false
assert Number.is_even(2) == true
assert Number.is_even(3) == false
assert Number.is_even(4) == true
assert Number.is_even(9) == false
assert Number.is_even(200) == true
end
end```

Where's QuickCheck when I need it? Or is that Concuerror I need? I can never keep those two straight. I do, however, recognize that ReBar wouldn't help here. Yet.

``````    defmodule Numbers do

def is_even(0), do: true

def is_even(value) when rem(value, 2) > 0 do
false
end

def is_even(_), do: true

end
``````

So far, so normal.

##5. Now, Rewrite it, With More Pipes

I picked far too simple an example for this. Trust me, though, if you want to hang with the cool kids, everything is a transformation, and every step of that transformation comes after a pipeline operator. Every program, once it's boiled down to its most basic structure, is this:

```Number
|> Function
|> Print```

Remember that.

##6. Good, Now Take Out all the Parentheses You Can

``````    defmodule Number do

def is_even 0, do: 1
def is_even(value) when rem(value, 2) > 0 do
value+1
end
def is_even(_), do: true

end
``````

It's usually harder to read, but the cool kids will like you more.

##7. Use OTP

No matter what your program does, it'll be sweeter if 100 processes are doing it at the same time, waiting to receive your message and increment a counter somewhere. If you can break up the task to run across multiple servers at the same time, you'll also be crowned King of FP for the moment.

I changed the program to return the next even number.

```defmodule Even.Server do

use GenServer

def handle_call(:prime_or_not, _from, number) do
end

def next_even_number(number) do
Even.Server.handle_call(:prime_or_not, number)
end

end```

##8. Post it to Hex.pm

Instructions yet to come. Get it in now, though, while all the good names aren't already taken.

##9. Brag on Twitter that you've reinvented the wheel, but it's functional!

I just reinvented the wheel! This time, it’s functional! #MyElixirStatus

— Augie De Blieck Jr. (@augiedb) August 20, 2014

##10. Go back to getting paid for making Ruby on Rails sites for corporate intranets.

I saw your fingers twitching there. I know what you want to do. I know what you're thinking:

`rails new`

##11. Convert it to Modern Elixir

That is, scrap your OTP port and convert it to the Phoenix framework.

##12. Extra Credit!

Rewrite the program using as many macros as possible....

Now go update your resume with "Elixir Ninja" and consider yourself "Full Stack"!

You can’t perform that action at this time.