File indexing completed on 2024-05-12 04:02:08

0001 <!DOCTYPE html>
0002 <html><head>
0003 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
0004 <title>learnelixir.exs</title>
0005 <meta name="generator" content="KF5::SyntaxHighlighting - Definition (Elixir) - Theme (Breeze Dark)"/>
0006 </head><body style="background-color:#232629;color:#cfcfc2"><pre>
0007 <span style="color:#7a7c7d"># Original: https://learnxinyminutes.com/docs/elixir/</span>
0008 
0009 <span style="color:#7a7c7d"># Single line comments start with a number symbol.</span>
0010 
0011 <span style="color:#7a7c7d"># There's no multi-line comment,</span>
0012 <span style="color:#7a7c7d"># but you can stack multiple comments.</span>
0013 
0014 <span style="color:#7a7c7d"># To use the elixir shell use the `iex` command.</span>
0015 <span style="color:#7a7c7d"># Compile your modules with the `elixirc` command.</span>
0016 
0017 <span style="color:#7a7c7d"># Both should be in your path if you installed elixir correctly.</span>
0018 
0019 <span style="color:#7a7c7d">## ---------------------------</span>
0020 <span style="color:#7a7c7d">## -- Basic types</span>
0021 <span style="color:#7a7c7d">## ---------------------------</span>
0022 
0023 <span style="color:#7a7c7d"># There are numbers</span>
0024 <span style="color:#f67400">3</span>    <span style="color:#7a7c7d"># integer</span>
0025 <span style="color:#f67400">0x1F</span> <span style="color:#7a7c7d"># integer</span>
0026 <span style="color:#f67400">3.0</span>  <span style="color:#7a7c7d"># float</span>
0027 
0028 <span style="color:#7a7c7d"># Atoms, that are literals, a constant with name. They start with `:`.</span>
0029 <span style="color:#27aeae">:hello</span> <span style="color:#7a7c7d"># atom</span>
0030 
0031 <span style="color:#7a7c7d"># Tuples that are stored contiguously in memory.</span>
0032 <span style="color:#8e44ad">{</span><span style="color:#f67400">1</span>,<span style="color:#f67400">2</span>,<span style="color:#f67400">3</span><span style="color:#8e44ad">}</span> <span style="color:#7a7c7d"># tuple</span>
0033 
0034 <span style="color:#7a7c7d"># We can access a tuple element with the `elem` function:</span>
0035 elem<span style="color:#8e44ad">({</span><span style="color:#f67400">1</span>, <span style="color:#f67400">2</span>, <span style="color:#f67400">3</span><span style="color:#8e44ad">}</span>, <span style="color:#f67400">0</span><span style="color:#8e44ad">)</span> <span style="color:#7a7c7d">#=> 1</span>
0036 
0037 <span style="color:#7a7c7d"># Lists that are implemented as linked lists.</span>
0038 <span style="color:#27ae60">[</span><span style="color:#f67400">1</span>,<span style="color:#f67400">2</span>,<span style="color:#f67400">3</span><span style="color:#27ae60">]</span> <span style="color:#7a7c7d"># list</span>
0039 
0040 <span style="color:#7a7c7d"># We can access the head and tail of a list as follows:</span>
0041 <span style="color:#27ae60">[</span>head <span style="color:#3f8058">|</span> tail<span style="color:#27ae60">]</span> <span style="color:#3f8058">=</span> <span style="color:#27ae60">[</span><span style="color:#f67400">1</span>,<span style="color:#f67400">2</span>,<span style="color:#f67400">3</span><span style="color:#27ae60">]</span>
0042 head <span style="color:#7a7c7d">#=> 1</span>
0043 tail <span style="color:#7a7c7d">#=> [2,3]</span>
0044 
0045 <span style="color:#7a7c7d"># In elixir, just like in Erlang, the `=` denotes pattern matching and</span>
0046 <span style="color:#7a7c7d"># not an assignment.</span>
0047 <span style="color:#7a7c7d">#</span>
0048 <span style="color:#7a7c7d"># This means that the left-hand side (pattern) is matched against a</span>
0049 <span style="color:#7a7c7d"># right-hand side.</span>
0050 <span style="color:#7a7c7d">#</span>
0051 <span style="color:#7a7c7d"># This is how the above example of accessing the head and tail of a list works.</span>
0052 
0053 <span style="color:#7a7c7d"># A pattern match will error when the sides don't match, in this example</span>
0054 <span style="color:#7a7c7d"># the tuples have different sizes.</span>
0055 <span style="color:#7a7c7d"># {a, b, c} = {1, 2} #=> ** (MatchError) no match of right hand side value: {1,2}</span>
0056 
0057 <span style="color:#7a7c7d"># There are also binaries</span>
0058 <span style="color:#3f8058">&lt;&lt;</span><span style="color:#f67400">1</span>,<span style="color:#f67400">2</span>,<span style="color:#f67400">3</span><span style="color:#3f8058">>></span> <span style="color:#7a7c7d"># binary</span>
0059 
0060 <span style="color:#7a7c7d"># Strings and char lists</span>
0061 <span style="color:#f44f4f">"hello"</span> <span style="color:#7a7c7d"># string</span>
0062 <span style="color:#da4453">'hello'</span> <span style="color:#7a7c7d"># char list</span>
0063 
0064 <span style="color:#7a7c7d"># Multi-line strings</span>
0065 <span style="color:#f44f4f">"""</span>
0066 <span style="color:#f44f4f">I'm a multi-line</span>
0067 <span style="color:#f44f4f">string.</span>
0068 <span style="color:#f44f4f">"""</span>
0069 <span style="color:#7a7c7d">#=> "I'm a multi-line\nstring.\n"</span>
0070 
0071 <span style="color:#7a7c7d"># Strings are all encoded in UTF-8:</span>
0072 <span style="color:#f44f4f">"héllò"</span> <span style="color:#7a7c7d">#=> "héllò"</span>
0073 
0074 <span style="color:#7a7c7d"># Strings are really just binaries, and char lists are just lists.</span>
0075 <span style="color:#3f8058">&lt;&lt;</span>?a, ?b, ?c<span style="color:#3f8058">>></span> <span style="color:#7a7c7d">#=> "abc"</span>
0076 <span style="color:#27ae60">[</span>?a, ?b, ?c<span style="color:#27ae60">]</span>   <span style="color:#7a7c7d">#=> 'abc'</span>
0077 
0078 <span style="color:#7a7c7d"># `?a` in elixir returns the ASCII integer for the letter `a`</span>
0079 ?a <span style="color:#7a7c7d">#=> 97</span>
0080 
0081 <span style="color:#7a7c7d"># To concatenate lists use `++`, for binaries use `&lt;>`</span>
0082 <span style="color:#27ae60">[</span><span style="color:#f67400">1</span>,<span style="color:#f67400">2</span>,<span style="color:#f67400">3</span><span style="color:#27ae60">]</span> <span style="color:#3f8058">++</span> <span style="color:#27ae60">[</span><span style="color:#f67400">4</span>,<span style="color:#f67400">5</span><span style="color:#27ae60">]</span>     <span style="color:#7a7c7d">#=> [1,2,3,4,5]</span>
0083 <span style="color:#da4453">'hello '</span> <span style="color:#3f8058">++</span> <span style="color:#da4453">'world'</span>  <span style="color:#7a7c7d">#=> 'hello world'</span>
0084 
0085 <span style="color:#3f8058">&lt;&lt;</span><span style="color:#f67400">1</span>,<span style="color:#f67400">2</span>,<span style="color:#f67400">3</span><span style="color:#3f8058">>></span> <span style="color:#3f8058">&lt;></span> <span style="color:#3f8058">&lt;&lt;</span><span style="color:#f67400">4</span>,<span style="color:#f67400">5</span><span style="color:#3f8058">>></span> <span style="color:#7a7c7d">#=> &lt;&lt;1,2,3,4,5>></span>
0086 <span style="color:#f44f4f">"hello "</span> <span style="color:#3f8058">&lt;></span> <span style="color:#f44f4f">"world"</span>  <span style="color:#7a7c7d">#=> "hello world"</span>
0087 
0088 <span style="color:#7a7c7d"># Ranges are represented as `start..end` (both inclusive)</span>
0089 <span style="color:#f67400">1</span><span style="color:#3f8058">..</span><span style="color:#f67400">10</span> <span style="color:#7a7c7d">#=> 1..10</span>
0090 lower<span style="color:#3f8058">..</span>upper <span style="color:#3f8058">=</span> <span style="color:#f67400">1</span><span style="color:#3f8058">..</span><span style="color:#f67400">10</span> <span style="color:#7a7c7d"># Can use pattern matching on ranges as well</span>
0091 <span style="color:#27ae60">[</span>lower, upper<span style="color:#27ae60">]</span> <span style="color:#7a7c7d">#=> [1, 10]</span>
0092 
0093 <span style="color:#7a7c7d">## ---------------------------</span>
0094 <span style="color:#7a7c7d">## -- Operators</span>
0095 <span style="color:#7a7c7d">## ---------------------------</span>
0096 
0097 <span style="color:#7a7c7d"># Some math</span>
0098 <span style="color:#f67400">1</span> <span style="color:#3f8058">+</span> <span style="color:#f67400">1</span>  <span style="color:#7a7c7d">#=> 2</span>
0099 <span style="color:#f67400">10</span> <span style="color:#3f8058">-</span> <span style="color:#f67400">5</span> <span style="color:#7a7c7d">#=> 5</span>
0100 <span style="color:#f67400">5</span> <span style="color:#3f8058">*</span> <span style="color:#f67400">2</span>  <span style="color:#7a7c7d">#=> 10</span>
0101 <span style="color:#f67400">10</span> <span style="color:#3f8058">/</span> <span style="color:#f67400">2</span> <span style="color:#7a7c7d">#=> 5.0</span>
0102 
0103 <span style="color:#7a7c7d"># In elixir the operator `/` always returns a float.</span>
0104 
0105 <span style="color:#7a7c7d"># To do integer division use `div`</span>
0106 div<span style="color:#8e44ad">(</span><span style="color:#f67400">10</span>, <span style="color:#f67400">2</span><span style="color:#8e44ad">)</span> <span style="color:#7a7c7d">#=> 5</span>
0107 
0108 <span style="color:#7a7c7d"># To get the division remainder use `rem`</span>
0109 rem<span style="color:#8e44ad">(</span><span style="color:#f67400">10</span>, <span style="color:#f67400">3</span><span style="color:#8e44ad">)</span> <span style="color:#7a7c7d">#=> 1</span>
0110 
0111 <span style="color:#7a7c7d"># There are also boolean operators: `or`, `and` and `not`.</span>
0112 <span style="color:#7a7c7d"># These operators expect a boolean as their first argument.</span>
0113 <span style="color:#27aeae;font-weight:bold">true</span> <span style="font-weight:bold">and</span> <span style="color:#27aeae;font-weight:bold">true</span> <span style="color:#7a7c7d">#=> true</span>
0114 <span style="color:#27aeae;font-weight:bold">false</span> <span style="font-weight:bold">or</span> <span style="color:#27aeae;font-weight:bold">true</span> <span style="color:#7a7c7d">#=> true</span>
0115 <span style="color:#7a7c7d"># 1 and true    #=> ** (ArgumentError) argument error</span>
0116 
0117 <span style="color:#7a7c7d"># Elixir also provides `||`, `&amp;&amp;` and `!` which accept arguments of any type.</span>
0118 <span style="color:#7a7c7d"># All values except `false` and `nil` will evaluate to true.</span>
0119 <span style="color:#f67400">1</span> <span style="color:#3f8058">||</span> <span style="color:#27aeae;font-weight:bold">true</span>  <span style="color:#7a7c7d">#=> 1</span>
0120 <span style="color:#27aeae;font-weight:bold">false</span> <span style="color:#3f8058">&amp;&amp;</span> <span style="color:#f67400">1</span> <span style="color:#7a7c7d">#=> false</span>
0121 <span style="color:#27aeae;font-weight:bold">nil</span> <span style="color:#3f8058">&amp;&amp;</span> <span style="color:#f67400">20</span>  <span style="color:#7a7c7d">#=> nil</span>
0122 !true <span style="color:#7a7c7d">#=> false</span>
0123 
0124 <span style="color:#7a7c7d"># For comparisons we have: `==`, `!=`, `===`, `!==`, `&lt;=`, `>=`, `&lt;` and `>`</span>
0125 <span style="color:#f67400">1</span> <span style="color:#3f8058">==</span> <span style="color:#f67400">1</span> <span style="color:#7a7c7d">#=> true</span>
0126 <span style="color:#f67400">1</span><span style="color:#3f8058"> !=</span> <span style="color:#f67400">1</span> <span style="color:#7a7c7d">#=> false</span>
0127 <span style="color:#f67400">1</span> <span style="color:#3f8058">&lt;</span> <span style="color:#f67400">2</span>  <span style="color:#7a7c7d">#=> true</span>
0128 
0129 <span style="color:#7a7c7d"># `===` and `!==` are more strict when comparing integers and floats:</span>
0130 <span style="color:#f67400">1</span> <span style="color:#3f8058">==</span> <span style="color:#f67400">1.0</span>  <span style="color:#7a7c7d">#=> true</span>
0131 <span style="color:#f67400">1</span> <span style="color:#3f8058">===</span> <span style="color:#f67400">1.0</span> <span style="color:#7a7c7d">#=> false</span>
0132 
0133 <span style="color:#7a7c7d"># We can also compare two different data types:</span>
0134 <span style="color:#f67400">1</span> <span style="color:#3f8058">&lt;</span> <span style="color:#27aeae">:hello</span> <span style="color:#7a7c7d">#=> true</span>
0135 
0136 <span style="color:#7a7c7d"># The overall sorting order is defined below:</span>
0137 <span style="color:#7a7c7d"># number &lt; atom &lt; reference &lt; functions &lt; port &lt; pid &lt; tuple &lt; list &lt; bit string</span>
0138 
0139 <span style="color:#7a7c7d"># To quote Joe Armstrong on this: "The actual order is not important,</span>
0140 <span style="color:#7a7c7d"># but that a total ordering is well defined is important."</span>
0141 
0142 <span style="color:#7a7c7d">## ---------------------------</span>
0143 <span style="color:#7a7c7d">## -- Control Flow</span>
0144 <span style="color:#7a7c7d">## ---------------------------</span>
0145 
0146 <span style="color:#7a7c7d"># `if` expression</span>
0147 <span style="color:#fdbc4b;font-weight:bold">if</span> <span style="color:#27aeae;font-weight:bold">false</span> <span style="font-weight:bold">do</span>
0148   <span style="color:#f44f4f">"This will never be seen"</span>
0149 <span style="color:#fdbc4b;font-weight:bold">else</span>
0150   <span style="color:#f44f4f">"This will"</span>
0151 <span style="font-weight:bold">end</span>
0152 
0153 <span style="color:#7a7c7d"># There's also `unless`</span>
0154 <span style="color:#fdbc4b;font-weight:bold">unless</span> <span style="color:#27aeae;font-weight:bold">true</span> <span style="font-weight:bold">do</span>
0155   <span style="color:#f44f4f">"This will never be seen"</span>
0156 <span style="color:#fdbc4b;font-weight:bold">else</span>
0157   <span style="color:#f44f4f">"This will"</span>
0158 <span style="font-weight:bold">end</span>
0159 
0160 <span style="color:#7a7c7d"># Remember pattern matching? Many control-flow structures in elixir rely on it.</span>
0161 
0162 <span style="color:#7a7c7d"># `case` allows us to compare a value against many patterns:</span>
0163 <span style="font-weight:bold">case</span> <span style="color:#8e44ad">{</span><span style="color:#27aeae">:one</span>, <span style="color:#27aeae">:two</span><span style="color:#8e44ad">}</span> <span style="font-weight:bold">do</span>
0164   <span style="color:#8e44ad">{</span><span style="color:#27aeae">:four</span>, <span style="color:#27aeae">:five</span><span style="color:#8e44ad">}</span> <span style="color:#3f8058">-></span>
0165     <span style="color:#f44f4f">"This won't match"</span>
0166   <span style="color:#8e44ad">{</span><span style="color:#27aeae">:one</span>, x<span style="color:#8e44ad">}</span> <span style="color:#3f8058">-></span>
0167     <span style="color:#f44f4f">"This will match and bind `x` to `:two`"</span>
0168   _ <span style="color:#3f8058">-></span>
0169     <span style="color:#f44f4f">"This will match any value"</span>
0170 <span style="font-weight:bold">end</span>
0171 
0172 <span style="color:#7a7c7d"># It's common to bind the value to `_` if we don't need it.</span>
0173 <span style="color:#7a7c7d"># For example, if only the head of a list matters to us:</span>
0174 <span style="color:#27ae60">[</span>head <span style="color:#3f8058">|</span> _<span style="color:#27ae60">]</span> <span style="color:#3f8058">=</span> <span style="color:#27ae60">[</span><span style="color:#f67400">1</span>,<span style="color:#f67400">2</span>,<span style="color:#f67400">3</span><span style="color:#27ae60">]</span>
0175 head <span style="color:#7a7c7d">#=> 1</span>
0176 
0177 <span style="color:#7a7c7d"># For better readability we can do the following:</span>
0178 <span style="color:#27ae60">[</span>head <span style="color:#3f8058">|</span> _tail<span style="color:#27ae60">]</span> <span style="color:#3f8058">=</span> <span style="color:#27ae60">[</span><span style="color:#27aeae">:a</span>, <span style="color:#27aeae">:b</span>, <span style="color:#27aeae">:c</span><span style="color:#27ae60">]</span>
0179 head <span style="color:#7a7c7d">#=> :a</span>
0180 
0181 <span style="color:#7a7c7d"># `cond` lets us check for many conditions at the same time.</span>
0182 <span style="color:#7a7c7d"># Use `cond` instead of nesting many `if` expressions.</span>
0183 <span style="color:#fdbc4b;font-weight:bold">cond</span> <span style="font-weight:bold">do</span>
0184   <span style="color:#f67400">1</span> <span style="color:#3f8058">+</span> <span style="color:#f67400">1</span> <span style="color:#3f8058">==</span> <span style="color:#f67400">3</span> <span style="color:#3f8058">-></span>
0185     <span style="color:#f44f4f">"I will never be seen"</span>
0186   <span style="color:#f67400">2</span> <span style="color:#3f8058">*</span> <span style="color:#f67400">5</span> <span style="color:#3f8058">==</span> <span style="color:#f67400">12</span> <span style="color:#3f8058">-></span>
0187     <span style="color:#f44f4f">"Me neither"</span>
0188   <span style="color:#f67400">1</span> <span style="color:#3f8058">+</span> <span style="color:#f67400">2</span> <span style="color:#3f8058">==</span> <span style="color:#f67400">3</span> <span style="color:#3f8058">-></span>
0189     <span style="color:#f44f4f">"But I will"</span>
0190 <span style="font-weight:bold">end</span>
0191 
0192 <span style="color:#7a7c7d"># It is common to set the last condition equal to `true`, which will always match.</span>
0193 <span style="color:#fdbc4b;font-weight:bold">cond</span> <span style="font-weight:bold">do</span>
0194   <span style="color:#f67400">1</span> <span style="color:#3f8058">+</span> <span style="color:#f67400">1</span> <span style="color:#3f8058">==</span> <span style="color:#f67400">3</span> <span style="color:#3f8058">-></span>
0195     <span style="color:#f44f4f">"I will never be seen"</span>
0196   <span style="color:#f67400">2</span> <span style="color:#3f8058">*</span> <span style="color:#f67400">5</span> <span style="color:#3f8058">==</span> <span style="color:#f67400">12</span> <span style="color:#3f8058">-></span>
0197     <span style="color:#f44f4f">"Me neither"</span>
0198   <span style="color:#27aeae;font-weight:bold">true</span> <span style="color:#3f8058">-></span>
0199     <span style="color:#f44f4f">"But I will (this is essentially an else)"</span>
0200 <span style="font-weight:bold">end</span>
0201 
0202 <span style="color:#7a7c7d"># `try/catch` is used to catch values that are thrown, it also supports an</span>
0203 <span style="color:#7a7c7d"># `after` clause that is invoked whether or not a value is caught.</span>
0204 <span style="color:#fdbc4b;font-weight:bold">try</span> <span style="font-weight:bold">do</span>
0205   <span style="color:#fdbc4b;font-weight:bold">throw</span><span style="color:#8e44ad">(</span><span style="color:#27aeae">:hello</span><span style="color:#8e44ad">)</span>
0206 <span style="color:#fdbc4b;font-weight:bold">catch</span>
0207   message <span style="color:#3f8058">-></span> <span style="color:#f44f4f">"Got </span><span style="color:#27ae60">#{</span>message<span style="color:#27ae60">}</span><span style="color:#f44f4f">."</span>
0208 <span style="font-weight:bold">after</span>
0209   <span style="color:#27aeae;font-weight:bold">IO</span><span style="color:#3f8058">.</span>puts<span style="color:#8e44ad">(</span><span style="color:#f44f4f">"I'm the after clause."</span><span style="color:#8e44ad">)</span>
0210 <span style="font-weight:bold">end</span>
0211 <span style="color:#7a7c7d">#=> I'm the after clause</span>
0212 <span style="color:#7a7c7d"># "Got :hello"</span>
0213 
0214 <span style="color:#7a7c7d">## ---------------------------</span>
0215 <span style="color:#7a7c7d">## -- Modules and Functions</span>
0216 <span style="color:#7a7c7d">## ---------------------------</span>
0217 
0218 <span style="color:#7a7c7d"># Anonymous functions (notice the dot)</span>
0219 square <span style="color:#3f8058">=</span> <span style="font-weight:bold">fn</span><span style="color:#8e44ad">(</span>x<span style="color:#8e44ad">)</span> <span style="color:#3f8058">-></span> x <span style="color:#3f8058">*</span> x <span style="font-weight:bold">end</span>
0220 square<span style="color:#3f8058">.</span><span style="color:#8e44ad">(</span><span style="color:#f67400">5</span><span style="color:#8e44ad">)</span> <span style="color:#7a7c7d">#=> 25</span>
0221 
0222 <span style="color:#7a7c7d"># They also accept many clauses and guards.</span>
0223 <span style="color:#7a7c7d"># Guards let you fine tune pattern matching,</span>
0224 <span style="color:#7a7c7d"># they are indicated by the `when` keyword:</span>
0225 f <span style="color:#3f8058">=</span> <span style="font-weight:bold">fn</span>
0226   x, y <span style="font-weight:bold">when</span> x <span style="color:#3f8058">></span> <span style="color:#f67400">0</span> <span style="color:#3f8058">-></span> x <span style="color:#3f8058">+</span> y
0227   x, y <span style="color:#3f8058">-></span> x <span style="color:#3f8058">*</span> y
0228 <span style="font-weight:bold">end</span>
0229 
0230 f<span style="color:#3f8058">.</span><span style="color:#8e44ad">(</span><span style="color:#f67400">1</span>, <span style="color:#f67400">3</span><span style="color:#8e44ad">)</span>  <span style="color:#7a7c7d">#=> 4</span>
0231 f<span style="color:#3f8058">.</span><span style="color:#8e44ad">(</span><span style="color:#3f8058">-</span><span style="color:#f67400">1</span>, <span style="color:#f67400">3</span><span style="color:#8e44ad">)</span> <span style="color:#7a7c7d">#=> -3</span>
0232 
0233 <span style="color:#7a7c7d"># Elixir also provides many built-in functions.</span>
0234 <span style="color:#7a7c7d"># These are available in the current scope.</span>
0235 is_number<span style="color:#8e44ad">(</span><span style="color:#f67400">10</span><span style="color:#8e44ad">)</span>    <span style="color:#7a7c7d">#=> true</span>
0236 is_list<span style="color:#8e44ad">(</span><span style="color:#f44f4f">"hello"</span><span style="color:#8e44ad">)</span> <span style="color:#7a7c7d">#=> false</span>
0237 elem<span style="color:#8e44ad">({</span><span style="color:#f67400">1</span>,<span style="color:#f67400">2</span>,<span style="color:#f67400">3</span><span style="color:#8e44ad">}</span>, <span style="color:#f67400">0</span><span style="color:#8e44ad">)</span> <span style="color:#7a7c7d">#=> 1</span>
0238 
0239 <span style="color:#7a7c7d"># You can group several functions into a module. Inside a module use `def`</span>
0240 <span style="color:#7a7c7d"># to define your functions.</span>
0241 <span style="font-weight:bold">defmodule</span> <span style="color:#27aeae;font-weight:bold">Math</span> <span style="font-weight:bold">do</span>
0242   <span style="font-weight:bold">def</span> sum<span style="color:#8e44ad">(</span>a, b<span style="color:#8e44ad">)</span> <span style="font-weight:bold">do</span>
0243     a <span style="color:#3f8058">+</span> b
0244   <span style="font-weight:bold">end</span>
0245 
0246   <span style="font-weight:bold">def</span> square<span style="color:#8e44ad">(</span>x<span style="color:#8e44ad">)</span> <span style="font-weight:bold">do</span>
0247     x <span style="color:#3f8058">*</span> x
0248   <span style="font-weight:bold">end</span>
0249 <span style="font-weight:bold">end</span>
0250 
0251 <span style="color:#27aeae;font-weight:bold">Math</span><span style="color:#3f8058">.</span>sum<span style="color:#8e44ad">(</span><span style="color:#f67400">1</span>, <span style="color:#f67400">2</span><span style="color:#8e44ad">)</span>  <span style="color:#7a7c7d">#=> 3</span>
0252 <span style="color:#27aeae;font-weight:bold">Math</span><span style="color:#3f8058">.</span>square<span style="color:#8e44ad">(</span><span style="color:#f67400">3</span><span style="color:#8e44ad">)</span> <span style="color:#7a7c7d">#=> 9</span>
0253 
0254 <span style="color:#7a7c7d"># To compile our simple Math module save it as `math.ex` and use `elixirc`</span>
0255 <span style="color:#7a7c7d"># in your terminal: elixirc math.ex</span>
0256 
0257 <span style="color:#7a7c7d"># Inside a module we can define functions with `def` and private functions with `defp`.</span>
0258 <span style="color:#7a7c7d"># A function defined with `def` is available to be invoked from other modules,</span>
0259 <span style="color:#7a7c7d"># a private function can only be invoked locally.</span>
0260 <span style="font-weight:bold">defmodule</span> <span style="color:#27aeae;font-weight:bold">PrivateMath</span> <span style="font-weight:bold">do</span>
0261   <span style="font-weight:bold">def</span> sum<span style="color:#8e44ad">(</span>a, b<span style="color:#8e44ad">)</span> <span style="font-weight:bold">do</span>
0262     do_sum<span style="color:#8e44ad">(</span>a, b<span style="color:#8e44ad">)</span>
0263   <span style="font-weight:bold">end</span>
0264 
0265   <span style="font-weight:bold">defp</span> do_sum<span style="color:#8e44ad">(</span>a, b<span style="color:#8e44ad">)</span> <span style="font-weight:bold">do</span>
0266     a <span style="color:#3f8058">+</span> b
0267   <span style="font-weight:bold">end</span>
0268 <span style="font-weight:bold">end</span>
0269 
0270 <span style="color:#27aeae;font-weight:bold">PrivateMath</span><span style="color:#3f8058">.</span>sum<span style="color:#8e44ad">(</span><span style="color:#f67400">1</span>, <span style="color:#f67400">2</span><span style="color:#8e44ad">)</span>    <span style="color:#7a7c7d">#=> 3</span>
0271 <span style="color:#7a7c7d"># PrivateMath.do_sum(1, 2) #=> ** (UndefinedFunctionError)</span>
0272 
0273 <span style="color:#7a7c7d"># Function declarations also support guards and multiple clauses:</span>
0274 <span style="font-weight:bold">defmodule</span> <span style="color:#27aeae;font-weight:bold">Geometry</span> <span style="font-weight:bold">do</span>
0275   <span style="font-weight:bold">def</span> area<span style="color:#8e44ad">({</span><span style="color:#27aeae">:rectangle</span>, w, h<span style="color:#8e44ad">})</span> <span style="font-weight:bold">do</span>
0276     w <span style="color:#3f8058">*</span> h
0277   <span style="font-weight:bold">end</span>
0278 
0279   <span style="font-weight:bold">def</span> area<span style="color:#8e44ad">({</span><span style="color:#27aeae">:circle</span>, r<span style="color:#8e44ad">})</span> <span style="font-weight:bold">when</span> is_number<span style="color:#8e44ad">(</span>r<span style="color:#8e44ad">)</span> <span style="font-weight:bold">do</span>
0280     <span style="color:#f67400">3.14</span> <span style="color:#3f8058">*</span> r <span style="color:#3f8058">*</span> r
0281   <span style="font-weight:bold">end</span>
0282 <span style="font-weight:bold">end</span>
0283 
0284 <span style="color:#27aeae;font-weight:bold">Geometry</span><span style="color:#3f8058">.</span>area<span style="color:#8e44ad">({</span><span style="color:#27aeae">:rectangle</span>, <span style="color:#f67400">2</span>, <span style="color:#f67400">3</span><span style="color:#8e44ad">})</span> <span style="color:#7a7c7d">#=> 6</span>
0285 <span style="color:#27aeae;font-weight:bold">Geometry</span><span style="color:#3f8058">.</span>area<span style="color:#8e44ad">({</span><span style="color:#27aeae">:circle</span>, <span style="color:#f67400">3</span><span style="color:#8e44ad">})</span>       <span style="color:#7a7c7d">#=> 28.25999999999999801048</span>
0286 <span style="color:#7a7c7d"># Geometry.area({:circle, "not_a_number"})</span>
0287 <span style="color:#7a7c7d">#=> ** (FunctionClauseError) no function clause matching in Geometry.area/1</span>
0288 
0289 <span style="color:#7a7c7d"># Due to immutability, recursion is a big part of elixir</span>
0290 <span style="font-weight:bold">defmodule</span> <span style="color:#27aeae;font-weight:bold">Recursion</span> <span style="font-weight:bold">do</span>
0291   <span style="font-weight:bold">def</span> sum_list<span style="color:#8e44ad">(</span><span style="color:#27ae60">[</span>head <span style="color:#3f8058">|</span> tail<span style="color:#27ae60">]</span>, acc<span style="color:#8e44ad">)</span> <span style="font-weight:bold">do</span>
0292     sum_list<span style="color:#8e44ad">(</span>tail, acc <span style="color:#3f8058">+</span> head<span style="color:#8e44ad">)</span>
0293   <span style="font-weight:bold">end</span>
0294 
0295   <span style="font-weight:bold">def</span> sum_list<span style="color:#8e44ad">(</span><span style="color:#27ae60">[]</span>, acc<span style="color:#8e44ad">)</span> <span style="font-weight:bold">do</span>
0296     acc
0297   <span style="font-weight:bold">end</span>
0298 <span style="font-weight:bold">end</span>
0299 
0300 <span style="color:#27aeae;font-weight:bold">Recursion</span><span style="color:#3f8058">.</span>sum_list<span style="color:#8e44ad">(</span><span style="color:#27ae60">[</span><span style="color:#f67400">1</span>,<span style="color:#f67400">2</span>,<span style="color:#f67400">3</span><span style="color:#27ae60">]</span>, <span style="color:#f67400">0</span><span style="color:#8e44ad">)</span> <span style="color:#7a7c7d">#=> 6</span>
0301 
0302 <span style="color:#7a7c7d"># Elixir modules support attributes, there are built-in attributes and you</span>
0303 <span style="color:#7a7c7d"># may also add custom ones.</span>
0304 <span style="font-weight:bold">defmodule</span> <span style="color:#27aeae;font-weight:bold">MyMod</span> <span style="font-weight:bold">do</span>
0305   <span style="color:#27ae60">@moduledoc """</span>
0306 <span style="color:#7a7c7d">  This is a built-in attribute on a example module.</span>
0307 <span style="color:#7a7c7d">  </span><span style="color:#27ae60">"""</span>
0308 
0309   <span style="color:#27ae60">@my_data</span> <span style="color:#f67400">100</span> <span style="color:#7a7c7d"># This is a custom attribute.</span>
0310   <span style="color:#27aeae;font-weight:bold">IO</span><span style="color:#3f8058">.</span>inspect<span style="color:#8e44ad">(</span><span style="color:#27ae60">@my_data</span><span style="color:#8e44ad">)</span> <span style="color:#7a7c7d">#=> 100</span>
0311 <span style="font-weight:bold">end</span>
0312 
0313 <span style="color:#7a7c7d">## ---------------------------</span>
0314 <span style="color:#7a7c7d">## -- Structs and Exceptions</span>
0315 <span style="color:#7a7c7d">## ---------------------------</span>
0316 
0317 <span style="color:#7a7c7d"># Structs are extensions on top of maps that bring default values,</span>
0318 <span style="color:#7a7c7d"># compile-time guarantees and polymorphism into Elixir.</span>
0319 <span style="font-weight:bold">defmodule</span> <span style="color:#27aeae;font-weight:bold">Person</span> <span style="font-weight:bold">do</span>
0320   <span style="font-weight:bold">defstruct</span> <span style="color:#27aeae">name:</span> <span style="color:#27aeae;font-weight:bold">nil</span>, <span style="color:#27aeae">age:</span> <span style="color:#f67400">0</span>, <span style="color:#27aeae">height:</span> <span style="color:#f67400">0</span>
0321 <span style="font-weight:bold">end</span>
0322 
0323 joe_info <span style="color:#3f8058">=</span> %<span style="color:#27aeae;font-weight:bold">Person</span><span style="color:#8e44ad">{</span> <span style="color:#27aeae">name:</span> <span style="color:#f44f4f">"Joe"</span>, <span style="color:#27aeae">age:</span> <span style="color:#f67400">30</span>, <span style="color:#27aeae">height:</span> <span style="color:#f67400">180</span> <span style="color:#8e44ad">}</span>
0324 <span style="color:#7a7c7d">#=> %Person{age: 30, height: 180, name: "Joe"}</span>
0325 
0326 <span style="color:#7a7c7d"># Access the value of name</span>
0327 joe_info<span style="color:#3f8058">.</span>name <span style="color:#7a7c7d">#=> "Joe"</span>
0328 
0329 <span style="color:#7a7c7d"># Update the value of age</span>
0330 older_joe_info <span style="color:#3f8058">=</span> %<span style="color:#8e44ad">{</span> joe_info <span style="color:#3f8058">|</span> <span style="color:#27aeae">age:</span> <span style="color:#f67400">31</span> <span style="color:#8e44ad">}</span>
0331 <span style="color:#7a7c7d">#=> %Person{age: 31, height: 180, name: "Joe"}</span>
0332 
0333 <span style="color:#7a7c7d"># The `try` block with the `rescue` keyword is used to handle exceptions</span>
0334 <span style="color:#fdbc4b;font-weight:bold">try</span> <span style="font-weight:bold">do</span>
0335   <span style="color:#fdbc4b;font-weight:bold">raise</span> <span style="color:#f44f4f">"some error"</span>
0336 <span style="color:#fdbc4b;font-weight:bold">rescue</span>
0337   <span style="color:#27aeae;font-weight:bold">RuntimeError</span> <span style="color:#3f8058">-></span> <span style="color:#f44f4f">"rescued a runtime error"</span>
0338   _error <span style="color:#3f8058">-></span> <span style="color:#f44f4f">"this will rescue any error"</span>
0339 <span style="font-weight:bold">end</span>
0340 <span style="color:#7a7c7d">#=> "rescued a runtime error"</span>
0341 
0342 <span style="color:#7a7c7d"># All exceptions have a message</span>
0343 <span style="color:#fdbc4b;font-weight:bold">try</span> <span style="font-weight:bold">do</span>
0344   <span style="color:#fdbc4b;font-weight:bold">raise</span> <span style="color:#f44f4f">"some error"</span>
0345 <span style="color:#fdbc4b;font-weight:bold">rescue</span>
0346   x <span style="font-weight:bold">in</span> <span style="color:#27ae60">[</span><span style="color:#27aeae;font-weight:bold">RuntimeError</span><span style="color:#27ae60">]</span> <span style="color:#3f8058">-></span>
0347     x<span style="color:#3f8058">.</span>message
0348 <span style="font-weight:bold">end</span>
0349 <span style="color:#7a7c7d">#=> "some error"</span>
0350 
0351 <span style="color:#7a7c7d">## ---------------------------</span>
0352 <span style="color:#7a7c7d">## -- Concurrency</span>
0353 <span style="color:#7a7c7d">## ---------------------------</span>
0354 
0355 <span style="color:#7a7c7d"># Elixir relies on the actor model for concurrency. All we need to write</span>
0356 <span style="color:#7a7c7d"># concurrent programs in elixir are three primitives: spawning processes,</span>
0357 <span style="color:#7a7c7d"># sending messages and receiving messages.</span>
0358 
0359 <span style="color:#7a7c7d"># To start a new process we use the `spawn` function, which takes a function</span>
0360 <span style="color:#7a7c7d"># as argument.</span>
0361 f <span style="color:#3f8058">=</span> <span style="font-weight:bold">fn</span> <span style="color:#3f8058">-></span> <span style="color:#f67400">2</span> <span style="color:#3f8058">*</span> <span style="color:#f67400">2</span> <span style="font-weight:bold">end</span> <span style="color:#7a7c7d">#=> #Function&lt;erl_eval.20.80484245></span>
0362 spawn<span style="color:#8e44ad">(</span>f<span style="color:#8e44ad">)</span> <span style="color:#7a7c7d">#=> #PID&lt;0.40.0></span>
0363 
0364 <span style="color:#7a7c7d"># `spawn` returns a pid (process identifier), you can use this pid to send</span>
0365 <span style="color:#7a7c7d"># messages to the process. To do message passing we use the `send` operator.</span>
0366 <span style="color:#7a7c7d"># For all of this to be useful we need to be able to receive messages. This is</span>
0367 <span style="color:#7a7c7d"># achieved with the `receive` mechanism:</span>
0368 
0369 <span style="color:#7a7c7d"># The `receive do` block is used to listen for messages and process</span>
0370 <span style="color:#7a7c7d"># them when they are received. A `receive do` block will only</span>
0371 <span style="color:#7a7c7d"># process one received message. In order to process multiple</span>
0372 <span style="color:#7a7c7d"># messages, a function with a `receive do` block must recursively</span>
0373 <span style="color:#7a7c7d"># call itself to get into the `receive do` block again.</span>
0374 
0375 <span style="font-weight:bold">defmodule</span> <span style="color:#27aeae;font-weight:bold">Geometry</span> <span style="font-weight:bold">do</span>
0376   <span style="font-weight:bold">def</span> area_loop <span style="font-weight:bold">do</span>
0377     <span style="font-weight:bold">receive</span> <span style="font-weight:bold">do</span>
0378       <span style="color:#8e44ad">{</span><span style="color:#27aeae">:rectangle</span>, w, h<span style="color:#8e44ad">}</span> <span style="color:#3f8058">-></span>
0379         <span style="color:#27aeae;font-weight:bold">IO</span><span style="color:#3f8058">.</span>puts<span style="color:#8e44ad">(</span><span style="color:#f44f4f">"Area = </span><span style="color:#27ae60">#{</span>w <span style="color:#3f8058">*</span> h<span style="color:#27ae60">}</span><span style="color:#f44f4f">"</span><span style="color:#8e44ad">)</span>
0380         area_loop<span style="color:#8e44ad">()</span>
0381       <span style="color:#8e44ad">{</span><span style="color:#27aeae">:circle</span>, r<span style="color:#8e44ad">}</span> <span style="color:#3f8058">-></span>
0382         <span style="color:#27aeae;font-weight:bold">IO</span><span style="color:#3f8058">.</span>puts<span style="color:#8e44ad">(</span><span style="color:#f44f4f">"Area = </span><span style="color:#27ae60">#{</span><span style="color:#f67400">3.14</span> <span style="color:#3f8058">*</span> r <span style="color:#3f8058">*</span> r<span style="color:#27ae60">}</span><span style="color:#f44f4f">"</span><span style="color:#8e44ad">)</span>
0383         area_loop<span style="color:#8e44ad">()</span>
0384     <span style="font-weight:bold">end</span>
0385   <span style="font-weight:bold">end</span>
0386 <span style="font-weight:bold">end</span>
0387 
0388 <span style="color:#7a7c7d"># Compile the module and create a process that evaluates `area_loop` in the shell</span>
0389 pid <span style="color:#3f8058">=</span> spawn<span style="color:#8e44ad">(</span><span style="font-weight:bold">fn</span> <span style="color:#3f8058">-></span> <span style="color:#27aeae;font-weight:bold">Geometry</span><span style="color:#3f8058">.</span>area_loop<span style="color:#8e44ad">()</span> <span style="font-weight:bold">end</span><span style="color:#8e44ad">)</span> <span style="color:#7a7c7d">#=> #PID&lt;0.40.0></span>
0390 <span style="color:#7a7c7d"># Alternatively</span>
0391 pid <span style="color:#3f8058">=</span> spawn<span style="color:#8e44ad">(</span><span style="color:#27aeae;font-weight:bold">Geometry</span>, <span style="color:#27aeae">:area_loop</span>, <span style="color:#27ae60">[]</span><span style="color:#8e44ad">)</span>
0392 
0393 <span style="color:#7a7c7d"># Send a message to `pid` that will match a pattern in the receive statement</span>
0394 send pid, <span style="color:#8e44ad">{</span><span style="color:#27aeae">:rectangle</span>, <span style="color:#f67400">2</span>, <span style="color:#f67400">3</span><span style="color:#8e44ad">}</span>
0395 <span style="color:#7a7c7d">#=> Area = 6</span>
0396 <span style="color:#7a7c7d">#   {:rectangle,2,3}</span>
0397 
0398 send pid, <span style="color:#8e44ad">{</span><span style="color:#27aeae">:circle</span>, <span style="color:#f67400">2</span><span style="color:#8e44ad">}</span>
0399 <span style="color:#7a7c7d">#=> Area = 12.56000000000000049738</span>
0400 <span style="color:#7a7c7d">#   {:circle,2}</span>
0401 
0402 <span style="color:#7a7c7d"># The shell is also a process, you can use `self` to get the current pid</span>
0403 self<span style="color:#8e44ad">()</span> <span style="color:#7a7c7d">#=> #PID&lt;0.27.0></span>
0404 
0405 <span style="color:#7a7c7d"># Code not found in the original, but needed to test the full range of the syntax</span>
0406 
0407 <span style="font-weight:bold">def</span> function, <span style="color:#27aeae">do:</span> <span style="color:#8e44ad">{</span><span style="color:#27aeae">:ok</span>, result<span style="color:#8e44ad">}</span>
0408 
0409 <span style="color:#27ae60">[</span>
0410   <span style="color:#27aeae">:a</span>,
0411   <span style="color:#27aeae">:b</span>,
0412   <span style="color:#27aeae">:c</span>
0413 <span style="color:#27ae60">]</span>
0414 
0415 %<span style="color:#8e44ad">{</span>
0416   <span style="color:#27aeae">a:</span> <span style="color:#f44f4f">"a"</span>,
0417   <span style="color:#27aeae">b:</span> <span style="color:#f44f4f">"b"</span>,
0418   <span style="color:#27aeae">c:</span> <span style="color:#f44f4f">"c"</span>
0419 <span style="color:#8e44ad">}</span>
0420 
0421 %A<span style="color:#8e44ad">{</span>
0422   <span style="color:#27aeae">a:</span> <span style="color:#f44f4f">"a"</span>,
0423   <span style="color:#27aeae">b:</span> <span style="color:#f44f4f">"b"</span>,
0424   <span style="color:#27aeae">c:</span> <span style="color:#f44f4f">"c"</span>
0425 <span style="color:#8e44ad">}</span>
0426 </pre></body></html>