Warning, file /frameworks/syntax-highlighting/autotests/html/learnelixir.exs.html was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

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