File indexing completed on 2025-02-02 03:54:46
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"><<</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"><<</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 `<>`</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"><<</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"><></span> <span style="color:#3f8058"><<</span><span style="color:#f67400">4</span>,<span style="color:#f67400">5</span><span style="color:#3f8058">>></span> <span style="color:#7a7c7d">#=> <<1,2,3,4,5>></span> 0086 <span style="color:#f44f4f">"hello "</span> <span style="color:#3f8058"><></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 `||`, `&&` 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">&&</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">&&</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: `==`, `!=`, `===`, `!==`, `<=`, `>=`, `<` 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"><</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"><</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 < atom < reference < functions < port < pid < tuple < list < 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<erl_eval.20.80484245></span> 0362 spawn<span style="color:#8e44ad">(</span>f<span style="color:#8e44ad">)</span> <span style="color:#7a7c7d">#=> #PID<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<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<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>