Warning, /frameworks/syntax-highlighting/autotests/reference/learnelixir.exs.ref is written in an unsupported language. File is not indexed.

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