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/>