diff options
author | mrshankly <mrshankly@riseup.net> | 2013-07-02 13:16:12 +0100 |
---|---|---|
committer | mrshankly <mrshankly@riseup.net> | 2013-07-02 13:16:12 +0100 |
commit | f68a80312b4bf56fd14b5f03d4644688d26710a0 (patch) | |
tree | 104f656a4fb50adac6c35b729d5c99eb5b8181fe /elixir.html.markdown | |
parent | a86c8fe2c959b4ada383c748e4aae1525b8bf7c3 (diff) |
Added section about functions, modules and records.
Diffstat (limited to 'elixir.html.markdown')
-rw-r--r-- | elixir.html.markdown | 116 |
1 files changed, 111 insertions, 5 deletions
diff --git a/elixir.html.markdown b/elixir.html.markdown index 9343a683..a37d0f5e 100644 --- a/elixir.html.markdown +++ b/elixir.html.markdown @@ -68,9 +68,9 @@ tail # => [2,3] ## JOIN BINARIES AND LISTS ###################################################### -## -------------------- +## --------------------------- ## -- Operators -## -------------------- +## --------------------------- # Some math 1 + 1 # => 2 @@ -118,9 +118,9 @@ number < atom < reference < functions < port < pid < tuple < list < bit string # To quote Joe Armstrong on this: "The actual order is not important, # but that a total ordering is well defined is important." -## -------------------- +## --------------------------- ## -- Control Flow -## -------------------- +## --------------------------- # `if` expression if false do @@ -199,6 +199,112 @@ end ## -- Modules and Functions ## --------------------------- +############################### +## EXPLAIN built-in functions? +############################### + +# Anonymous functions (notice the dot) +square = fn(x) -> x * x end +square.(5) #=> 25 + +# They also accept many clauses and guards +f = fn + x, y when x > 0 -> x + y + x, y -> x * y +end + +f.(1, 3) #=> 4 +f.(-1, 3) #=> -3 + +# You can group several functions into a module. Inside a module use `def` +# to define your functions. +defmodule Math do + def sum(a, b) do + a + b + end + + def square(x) do + x * x + end +end + +Math.sum(1, 2) #=> 3 +Match.square(3) #=> 9 + +# To compile our little Math module save it as `math.ex` and use `elixirc` +elixirc math.ex + +# Inside a module we can define functions with `def` and +# private functions with `defp`. +# +# A function defined with `def` is available to be invoked from other modules, +# a private function can only be invoked locally. +defmodule PrivateMath do + def sum(a, b) do + do_sum(a, b) + end + + defp do_sum(a, b) do + a + b + end +end + +PrivateMath.sum(1, 2) #=> 3 +PrivateMath.do_sum(1, 2) #=> ** (UndefinedFunctionError) + +# Function declarations also support guards and multiple clauses: +defmodule Geometry do + def area({:rectangle, w, h}) do + w * h + end + + def area({:circle, r}) when r > 0 do + 3.14 * r * r + end +end + +Geometry.area({:rectangle, 2, 3}) #=> 6 +Geometry.area({:circle, 3}) #=> 28.25999999999999801048 + +# Due to immutability, recursion is a big part of elixir +defmodule Recursion do + def sum_list([head | tail], acc) do + sum_list(tail, acc + head) + end + + def sum_list([], acc) do + acc + end +end + +Recursion.sum_list([1,2,3], 0) #=> 6 + +############################### +## EXPLAIN module attributes +############################### + +## --------------------------- +## -- Records and Exceptions +## --------------------------- + +# Records are basically structures that allow you to associate a name with +# a particular value. +defrecord Person, name: nil, age: 0, height: 0 + +joe_info = Person.new(name: "Joe", age: 30, height: 180) +#=> Person[name: "Joe", age: 30, height: 180] +# Access the value of name +joe_info.name #=> "Joe" + +# Update the value of age +joe_info = joe_info.age(31) #=> Person[name: "Joe", age: 31, height: 180] + +## TODO: Exceptions + +## --------------------------- +## -- Concurrency +## --------------------------- -```
\ No newline at end of file +## TODO +``` |