defmodule Counter.Core do def inc(value) do value + 1 end end defmodule Clock do def start(f) do run(f, 0) end def run(endless, count) do endless.(count) new_count = Counter.Core.inc(count) :timer.sleep(1000) run(endless, new_count) end end
Chapter 2 Elixir
defmodule Counter.Core do def inc(value) do value + 1 end end defmodule Counter.Server do def run(count) do new_count = listen(count) run(new_count) end def listen(count) do receive do {:tick, _pid} -> Counter.Core.inc(count) {:state, pid} -> send(pid, {:count, count}) count end end end defmodule Counter do def start(initial_count) do spawn( fn() -> Counter.Server.run(initial_count) end) end def tick(pid) do send pid, {:tick, self()} end def state(pid) do send pid, {:state, self()} receive do {:count, value} -> value end end end
Chapter 3 Elixir
Add test file counter_test.exs to the test folderdefmodule CounterTest do use ExUnit.Case test "inc increments an integer value" do assert Counter.Core.inc(1) == 2 end endAdd test file counter_api_test.exs to the test folder
defmodule CounterApiTest do use ExUnit.Case test "use counter through API" do pid = Counter.start(0) assert Counter.state(pid) == 0 Counter.tick(pid) Counter.tick(pid) count = Counter.state(pid) assert count == 2 end end
Chapter 4 Elixir
Create folder simple_elixir and in it create file hello.exsIO.puts "hello world"
Chapter 5 Elixir
run mix new pmap and edit pmap\lib\pmap.exdefmodule Parallel do def pmap(collection, func) do collection |> Enum.map(&(Task.async(fn -> func.(&1) end))) |> Enum.map(&Task.await/1) end end
Chapter 6 Elixir
Investigate functions using h(), the help function.Chapter 7 Elixir
Investigate concurrency. Run mix new add_example and edit add_example/lib/add_example.exdefmodule Add_Example do def add(a, b) do IO.puts(a + b) end endRun iex -S mix then enter the following two commands at the prompt to first make a blocking call then an asynchronous call.
Modify the code to process the response from the asynchronous call.
defmodule Add_Example do def listen do receive do {:ok, "hello"} -> IO.puts("World") end listen end end
Tuples and Lists
iex(15)> coins = [{"penny", 1}, {"nickel", 5}] [{"penny", 1}, {"nickel", 5}] iex(16)> coins = coins ++ [{"dime", 10}] [{"penny", 1}, {"nickel", 5}, {"dime", 10}] iex(17)> coins = coins ++ [{"quarter", 25}] [{"penny", 1}, {"nickel", 5}, {"dime", 10}, {"quarter", 25}] iex(18)> coins = [penny: 1, nickel: 5, dime: 10, quarter: 25] [penny: 1, nickel: 5, dime: 10, quarter: 25] iex(19)> Keyword.get(change, :dime) 10 iex(20)> change[:nickel] 5 iex(21)> change = [penny: 1] ++ [nickel: 5] ++ [dime: 10] [penny: 1, nickel: 5, dime: 10] iex(22)> pocket_change = [{"penny", 1}] ++ [{"nickel", 5}] ++ [{"dime", 10}] [{"penny", 1}, {"nickel", 5}, {"dime", 10}] iex(23)> {name, age} = {"Bob", 25} {"Bob", 25} iex(24)> bob = {name, age} {"Bob", 25} iex(25)> {date, time} = :calendar.local_time {{2019, 4, 30}, {22, 22, 24}} iex(26)> {_, {hours, minutes, _}} = :calendar.local_time {{2019, 4, 30}, {22, 28, 6}} iex(27)> [head | tail] = [1, 2, 3, 4] [1, 2, 3, 4] iex(28)> head 1 iex(29)> tail [2, 3, 4] iex(30)> [head1 | [head2 | tail]] = [1, 2, 3, 4] [1, 2, 3, 4] iex(31)> head1 1 iex(32)> head2 2 iex(33)>
Simple Functions
defmodule Splitter do def comma_split(str_quote) do str_quote |> String.split(",") end def letter_split(str_quote) do str_quote |> String.codepoints end end
Overloaded Functions
defmodule Geo do def how_big({:circle, radius}) do radius * radius * 3.14 end def how_big({:rectangle, {l, w}}) do l * w end end
iex(1)> Geo.how_big({:circle, 5}) 78.5 iex(2)> Geo.how_big({:rectangle, {4, 5}}) 20 iex(3)>
Equality
To avoid reassigning values to the variable, I move the variable to the RHS of the expression.iex(1)> k9 = %{dog1: "dog", fox1: "fox"} %{dog1: "dog", fox1: "fox"} iex(2)> %{dog1: "dog", fox1: "fox"} = k9 %{dog1: "dog", fox1: "fox"} iex(3)> %{dog1: "dog", fox1: "cat"} = k9 ** (MatchError) no match of right hand side value: %{dog1: "dog", fox1: "fox"} iex(4)>
Recursive Functions
defmodule Lists do def map([], _func), do: [] def map([h | t], func), do: [func.(h) | map(t, func)] end
iex(1)> Lists.map([], fn x -> 3 * x end) [] iex(2)> Lists.map([2,4,6], fn x -> 3 * x end) [6, 12, 18]