Elixir Examples A collection of small Elixir programming language examples. http://elixir-examples.github.iohttps://elixir-examples.github.io/ Thu, 19 Nov 2020 06:04:56 +0000 Thu, 19 Nov 2020 06:04:56 +0000 Jekyll v3.9.0 Elixir Get a value from nested maps <p>The <code class="language-plaintext highlighter-rouge">get_in</code> function can be used to retrieve a nested value in nested maps using a list of keys.</p> <figure class="highlight"><pre><code class="language-elixir" data-lang="elixir"><span class="n">nested</span> <span class="o">=</span> <span class="p">%{</span> <span class="ss">one:</span> <span class="p">%{</span> <span class="ss">two:</span> <span class="mi">3</span><span class="p">}</span> <span class="p">}</span> <span class="mi">3</span> <span class="o">=</span> <span class="n">get_in</span><span class="p">(</span><span class="n">nested</span><span class="p">,</span> <span class="p">[</span><span class="ss">:one</span><span class="p">,</span> <span class="ss">:two</span><span class="p">])</span> <span class="c1"># Returns nil for missing value</span> <span class="no">nil</span> <span class="o">=</span> <span class="n">get_in</span><span class="p">(</span><span class="n">nested</span><span class="p">,</span> <span class="p">[</span><span class="ss">:one</span><span class="p">,</span> <span class="ss">:three</span><span class="p">])</span></code></pre></figure> <p>Documentation:</p> <ul> <li><a href="http://elixir-lang.org/docs/stable/elixir/Kernel.html#get_in/2">Kernel.get_in/2</a></li> </ul> Fri, 28 Oct 2016 08:32:58 +0000 https://elixir-examples.github.io/examples/get-a-nested-map-value https://elixir-examples.github.io/examples/get-a-nested-map-value map Elixir Else if statement (See cond statement) <p>The <code class="language-plaintext highlighter-rouge">cond</code> keyword can be used like <code class="language-plaintext highlighter-rouge">else if</code> found in other languages. See <a href="/examples/cond-statement">cond statement</a></p> Thu, 25 Aug 2016 14:22:58 +0000 https://elixir-examples.github.io/examples/else-if-see-cond https://elixir-examples.github.io/examples/else-if-see-cond Kernel Elixir Switch statement (See case statement) <p>Elixir uses the keyword <code class="language-plaintext highlighter-rouge">case</code> instead of <code class="language-plaintext highlighter-rouge">switch</code>. See <a href="/examples/case-statement">case statement</a></p> Thu, 25 Aug 2016 14:20:58 +0000 https://elixir-examples.github.io/examples/switch-statement-see-case https://elixir-examples.github.io/examples/switch-statement-see-case Kernel Elixir Sum an enumerable <p>This example shows how to sum a list, map, range, or other enumerable to calculate a total value.</p> <figure class="highlight"><pre><code class="language-elixir" data-lang="elixir"><span class="c1"># Enum.sum/1 for numeric values</span> <span class="mi">6</span> <span class="o">==</span> <span class="no">Enum</span><span class="o">.</span><span class="n">sum</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">])</span> <span class="mi">6</span> <span class="o">==</span> <span class="no">Enum</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="mi">1</span><span class="o">..</span><span class="mi">3</span><span class="p">)</span> <span class="c1"># reduce to extract/transform a value during sum</span> <span class="mi">6</span> <span class="o">=</span> <span class="no">Enum</span><span class="o">.</span><span class="n">reduce</span><span class="p">(%{</span> <span class="ss">a:</span> <span class="mi">1</span><span class="p">,</span> <span class="ss">b:</span> <span class="mi">2</span><span class="p">,</span> <span class="ss">c:</span> <span class="mi">3</span> <span class="p">},</span> <span class="mi">0</span><span class="p">,</span> <span class="k">fn</span><span class="p">({</span><span class="n">_k</span><span class="p">,</span> <span class="n">v</span><span class="p">},</span> <span class="n">acc</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">v</span> <span class="o">+</span> <span class="n">acc</span> <span class="k">end</span><span class="p">)</span></code></pre></figure> <p>Documentation:</p> <ul> <li><a href="http://elixir-lang.org/docs/stable/elixir/Enum.html#sum/1">Enum.sum/1</a></li> <li><a href="http://elixir-lang.org/docs/stable/elixir/Enum.html#reduce/3">Enum.reduce/3</a></li> </ul> Mon, 23 May 2016 14:20:58 +0000 https://elixir-examples.github.io/examples/sum-an-enumerable https://elixir-examples.github.io/examples/sum-an-enumerable Enum Elixir Get a value from a struct <p>This example shows how to get a value from a struct field.</p> <figure class="highlight"><pre><code class="language-elixir" data-lang="elixir"><span class="c1"># Define a struct for this example</span> <span class="k">defmodule</span> <span class="no">User</span> <span class="k">do</span> <span class="k">defstruct</span> <span class="ss">email:</span> <span class="no">nil</span> <span class="k">end</span> <span class="c1"># dot syntax</span> <span class="s2">"c@c.com"</span> <span class="o">=</span> <span class="p">%</span><span class="no">User</span><span class="p">{</span><span class="ss">email:</span> <span class="s2">"c@c.com"</span><span class="p">}</span><span class="o">.</span><span class="n">email</span> <span class="c1"># Underlying implementation is a map</span> <span class="c1"># So Map methods work</span> <span class="s2">"c@c.com"</span> <span class="o">=</span> <span class="no">Map</span><span class="o">.</span><span class="n">get</span><span class="p">(%</span><span class="no">User</span><span class="p">{</span><span class="ss">email:</span> <span class="s2">"c@c.com"</span><span class="p">},</span> <span class="ss">:email</span><span class="p">)</span> <span class="c1"># Pattern match to get a value</span> <span class="p">%{</span> <span class="ss">email:</span> <span class="n">email</span> <span class="p">}</span> <span class="o">=</span> <span class="p">%</span><span class="no">User</span><span class="p">{</span><span class="ss">email:</span> <span class="s2">"c@c.com"</span><span class="p">}</span> <span class="p">%</span><span class="no">User</span><span class="p">{</span><span class="ss">email:</span> <span class="n">email</span><span class="p">}</span> <span class="o">=</span> <span class="p">%</span><span class="no">User</span><span class="p">{</span><span class="ss">email:</span> <span class="s2">"c@c.com"</span><span class="p">}</span> <span class="c1"># Access protocol not available by default</span> <span class="p">%</span><span class="no">User</span><span class="p">{</span><span class="ss">email:</span> <span class="s2">"c@c.com"</span><span class="p">}[</span><span class="ss">:email</span><span class="p">]</span> <span class="c1">#** (UndefinedFunctionError) undefined function User.fetch/2 (User does not implement the Access behaviour)</span> <span class="c1"># User.fetch(%User{email: "c@c.com"}, :email)</span> <span class="c1"># (elixir) lib/access.ex:118: Access.fetch/2</span> <span class="c1"># (elixir) lib/access.ex:149: Access.get/3</span> <span class="c1"># Enumerable protocol not available by default</span> <span class="no">Enum</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span> <span class="p">%</span><span class="no">User</span><span class="p">{</span><span class="ss">email:</span> <span class="s2">"c@c.com"</span><span class="p">},</span> <span class="k">fn</span><span class="p">({</span><span class="n">key</span><span class="p">,</span> <span class="n">_</span><span class="p">})</span> <span class="o">-&gt;</span> <span class="n">key</span> <span class="o">==</span> <span class="ss">:email</span> <span class="k">end</span><span class="p">)</span> <span class="c1">#** (Protocol.UndefinedError) protocol Enumerable not implemented for %User{email: "c@c.com"}</span> <span class="c1"># (elixir) lib/enum.ex:1: Enumerable.impl_for!/1</span> <span class="c1"># (elixir) lib/enum.ex:116: Enumerable.reduce/3</span> <span class="c1"># (elixir) lib/enum.ex:1477: Enum.reduce/3</span> <span class="c1"># (elixir) lib/enum.ex:742: Enum.filter/2</span></code></pre></figure> <p>Documentation:</p> <ul> <li><a href="http://elixir-lang.org/getting-started/structs.html">Structs</a></li> </ul> Sun, 27 Mar 2016 14:20:58 +0000 https://elixir-examples.github.io/examples/get-a-value-from-a-struct https://elixir-examples.github.io/examples/get-a-value-from-a-struct Struct Elixir Update a struct field <p>This example shows how to update a struct field.</p> <figure class="highlight"><pre><code class="language-elixir" data-lang="elixir"><span class="c1"># Define a struct for this example</span> <span class="k">defmodule</span> <span class="no">User</span> <span class="k">do</span> <span class="k">defstruct</span> <span class="ss">email:</span> <span class="no">nil</span> <span class="k">end</span> <span class="p">%</span><span class="no">User</span><span class="p">{</span><span class="ss">email:</span> <span class="s2">"c@c.com"</span><span class="p">}</span> <span class="o">=</span> <span class="n">struct</span><span class="p">(%</span><span class="no">User</span><span class="p">{},</span> <span class="ss">email:</span> <span class="s2">"c@c.com"</span><span class="p">)</span> <span class="c1"># Structs are based on maps</span> <span class="c1"># so map update methods and syntax are valid</span> <span class="p">%</span><span class="no">User</span><span class="p">{</span><span class="ss">email:</span> <span class="s2">"a@a.co"</span><span class="p">}</span> <span class="o">=</span> <span class="p">%{</span> <span class="p">%</span><span class="no">User</span><span class="p">{}</span> <span class="o">|</span> <span class="ss">email:</span> <span class="s2">"a@a.co"</span> <span class="p">}</span> <span class="p">%</span><span class="no">User</span><span class="p">{</span><span class="ss">email:</span> <span class="s2">"b@b.com"</span><span class="p">}</span> <span class="o">=</span> <span class="no">Map</span><span class="o">.</span><span class="n">put</span><span class="p">(%</span><span class="no">User</span><span class="p">{},</span> <span class="ss">:email</span><span class="p">,</span> <span class="s2">"b@b.com"</span><span class="p">)</span></code></pre></figure> <p>Documentation:</p> <ul> <li><a href="http://elixir-lang.org/getting-started/structs.html">Structs</a></li> <li><a href="http://elixir-lang.org/docs/stable/elixir/Kernel.html#struct/2">Kernel.struct/2</a></li> </ul> Fri, 25 Mar 2016 14:20:58 +0000 https://elixir-examples.github.io/examples/update-a-struct-field https://elixir-examples.github.io/examples/update-a-struct-field Struct Elixir Get a value from a keyword list <p>This example shows different ways to get values from a keyword list.</p> <figure class="highlight"><pre><code class="language-elixir" data-lang="elixir"><span class="c1"># [] can be used, first match returned</span> <span class="mi">1</span> <span class="o">=</span> <span class="p">[</span><span class="ss">a:</span> <span class="mi">1</span><span class="p">,</span> <span class="ss">b:</span> <span class="mi">2</span><span class="p">,</span> <span class="ss">a:</span> <span class="mi">3</span><span class="p">][</span><span class="ss">:a</span><span class="p">]</span> <span class="c1"># [] missing value is nil</span> <span class="no">nil</span> <span class="o">=</span> <span class="p">[</span><span class="ss">a:</span> <span class="mi">1</span><span class="p">,</span> <span class="ss">b:</span> <span class="mi">2</span><span class="p">,</span> <span class="ss">a:</span> <span class="mi">3</span><span class="p">][</span><span class="ss">:c</span><span class="p">]</span> <span class="c1"># Keyword get also works</span> <span class="mi">1</span> <span class="o">=</span> <span class="no">Keyword</span><span class="o">.</span><span class="n">get</span><span class="p">([</span><span class="ss">a:</span> <span class="mi">1</span><span class="p">,</span> <span class="ss">b:</span> <span class="mi">2</span><span class="p">,</span> <span class="ss">a:</span> <span class="mi">3</span><span class="p">],</span> <span class="ss">:a</span><span class="p">)</span> <span class="c1"># missing value is nil</span> <span class="no">nil</span> <span class="o">=</span> <span class="no">Keyword</span><span class="o">.</span><span class="n">get</span><span class="p">([</span><span class="ss">a:</span> <span class="mi">1</span><span class="p">,</span> <span class="ss">b:</span> <span class="mi">2</span><span class="p">,</span> <span class="ss">a:</span> <span class="mi">3</span><span class="p">],</span> <span class="ss">:c</span><span class="p">)</span> <span class="c1"># an optional default value can be specified</span> <span class="c1"># for missing keys</span> <span class="s2">"missing"</span> <span class="o">=</span> <span class="no">Keyword</span><span class="o">.</span><span class="n">get</span><span class="p">([</span><span class="ss">a:</span> <span class="mi">1</span><span class="p">,</span> <span class="ss">b:</span> <span class="mi">2</span><span class="p">,</span> <span class="ss">a:</span> <span class="mi">3</span><span class="p">],</span> <span class="ss">:c</span><span class="p">,</span> <span class="s2">"missing"</span><span class="p">)</span> <span class="c1"># Keyword.take returns a list of matching pairs</span> <span class="p">[</span><span class="ss">a:</span> <span class="mi">1</span><span class="p">,</span> <span class="ss">a:</span> <span class="mi">3</span><span class="p">]</span> <span class="o">=</span> <span class="no">Keyword</span><span class="o">.</span><span class="n">take</span><span class="p">([</span><span class="ss">a:</span> <span class="mi">1</span><span class="p">,</span> <span class="ss">b:</span> <span class="mi">2</span><span class="p">,</span> <span class="ss">a:</span> <span class="mi">3</span><span class="p">],</span> <span class="p">[</span><span class="ss">:a</span><span class="p">])</span> <span class="p">[]</span> <span class="o">=</span> <span class="no">Keyword</span><span class="o">.</span><span class="n">take</span><span class="p">([</span><span class="ss">a:</span> <span class="mi">1</span><span class="p">,</span> <span class="ss">b:</span> <span class="mi">2</span><span class="p">,</span> <span class="ss">a:</span> <span class="mi">3</span><span class="p">],</span> <span class="p">[</span><span class="ss">:c</span><span class="p">])</span> <span class="c1"># dot syntax does NOT work</span> <span class="c1"># results in compile error</span> <span class="p">[</span><span class="ss">a:</span> <span class="mi">1</span><span class="p">,</span> <span class="ss">b:</span> <span class="mi">2</span><span class="p">,</span> <span class="ss">a:</span> <span class="mi">3</span><span class="p">]</span><span class="o">.</span><span class="n">a</span></code></pre></figure> <p>Documentation: <a href="http://elixir-lang.org/docs/stable/elixir/Keyword.html">Keyword</a></p> Wed, 23 Mar 2016 14:20:58 +0000 https://elixir-examples.github.io/examples/get-a-value-from-a-keyword-list https://elixir-examples.github.io/examples/get-a-value-from-a-keyword-list Keyword List Elixir Add a key and value to a map <p>Add a key and value to a map.</p> <figure class="highlight"><pre><code class="language-elixir" data-lang="elixir"><span class="no">Map</span><span class="o">.</span><span class="n">put</span><span class="p">(%{</span><span class="ss">a:</span> <span class="mi">1</span><span class="p">},</span> <span class="ss">:b</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="p">%{</span><span class="ss">a:</span> <span class="mi">1</span><span class="p">,</span> <span class="ss">b:</span> <span class="mi">2</span><span class="p">}</span></code></pre></figure> Mon, 21 Mar 2016 21:30:00 +0000 https://elixir-examples.github.io/examples/add-to-a-map https://elixir-examples.github.io/examples/add-to-a-map map Elixir Boolean operators - and, or, &&, || <p>Elixir provides short-circuiting logical boolean operators <code class="language-plaintext highlighter-rouge">and</code>, <code class="language-plaintext highlighter-rouge">or</code>, <code class="language-plaintext highlighter-rouge">&amp;&amp;</code>, and <code class="language-plaintext highlighter-rouge">||</code>. The <code class="language-plaintext highlighter-rouge">and</code> and <code class="language-plaintext highlighter-rouge">or</code> operators are said to be strict because they only accept booleans and return a boolean result. The pipes <code class="language-plaintext highlighter-rouge">||</code> and ampersands <code class="language-plaintext highlighter-rouge">&amp;&amp;</code> are non-strict/relaxed and can take any value. The values <code class="language-plaintext highlighter-rouge">false</code> and <code class="language-plaintext highlighter-rouge">nil</code> are the only falsey values and everything else is true.</p> <p>Use <code class="language-plaintext highlighter-rouge">and</code> or <code class="language-plaintext highlighter-rouge">or</code> when you have boolean inputs and want a boolean result.</p> <figure class="highlight"><pre><code class="language-elixir" data-lang="elixir"><span class="no">false</span> <span class="o">=</span> <span class="no">false</span> <span class="ow">and</span> <span class="no">true</span> <span class="no">true</span> <span class="o">=</span> <span class="no">true</span> <span class="ow">and</span> <span class="no">true</span> <span class="no">true</span> <span class="o">=</span> <span class="no">true</span> <span class="ow">or</span> <span class="no">false</span> <span class="no">false</span> <span class="o">=</span> <span class="no">false</span> <span class="ow">or</span> <span class="no">false</span> <span class="c1"># A non boolean argument results in an ArgumentError</span> <span class="s2">"hello"</span> <span class="ow">and</span> <span class="no">true</span> <span class="c1"># || can be used to assign fallback/default values</span> <span class="s2">"default"</span> <span class="o">=</span> <span class="no">nil</span> <span class="o">||</span> <span class="s2">"default"</span> <span class="c1"># short-circuted || result since left side being</span> <span class="c1"># true makes it true</span> <span class="s2">"first"</span> <span class="o">=</span> <span class="s2">"first"</span> <span class="o">||</span> <span class="s2">"second"</span> <span class="s2">"second"</span> <span class="o">=</span> <span class="s2">"first"</span> <span class="o">&amp;&amp;</span> <span class="s2">"second"</span> <span class="c1"># short-circuted &amp;&amp; result, left-side false value returned</span> <span class="no">false</span> <span class="o">=</span> <span class="no">false</span> <span class="o">&amp;&amp;</span> <span class="s2">"second"</span></code></pre></figure> <p>Documentation: <a href="http://elixir-lang.org/getting-started/basic-operators.html">Basic Operators</a></p> Mon, 21 Mar 2016 13:00:58 +0000 https://elixir-examples.github.io/examples/boolean-operators https://elixir-examples.github.io/examples/boolean-operators Kernel Elixir Behaviours <p>Behaviours provide a way to define an interface which a module can implement. A module declares that it implements the Behaviour with the <code class="language-plaintext highlighter-rouge">@behaviour</code> annotation. The functions in the modules implementing the behaviour will be checked at compile time to see if they match the function specifications in the behavior.</p> <figure class="highlight"><pre><code class="language-elixir" data-lang="elixir"><span class="c1"># The @callback annotations below define function specifications that a</span> <span class="c1"># module needs to implement the behaviour. The @callback parameter and</span> <span class="c1"># return types must be specified or a compile error will occur.</span> <span class="k">defmodule</span> <span class="no">Greeter</span> <span class="k">do</span> <span class="nv">@callback</span> <span class="n">say_hello</span><span class="p">(</span><span class="no">String</span><span class="o">.</span><span class="n">t</span><span class="p">)</span> <span class="p">::</span> <span class="n">any</span> <span class="nv">@callback</span> <span class="n">say_goodbye</span><span class="p">(</span><span class="no">String</span><span class="o">.</span><span class="n">t</span><span class="p">)</span> <span class="p">::</span> <span class="n">any</span> <span class="k">end</span> <span class="c1"># A module uses the @behaviour annotation to indicate</span> <span class="c1"># that it implements a behaviour</span> <span class="k">defmodule</span> <span class="no">NormalGreeter</span> <span class="k">do</span> <span class="nv">@behaviour</span> <span class="no">Greeter</span> <span class="k">def</span> <span class="n">say_hello</span><span class="p">(</span><span class="n">name</span><span class="p">),</span> <span class="k">do</span><span class="p">:</span> <span class="no">IO</span><span class="o">.</span><span class="n">puts</span> <span class="s2">"Hello, </span><span class="si">#{</span><span class="n">name</span><span class="si">}</span><span class="s2">"</span> <span class="k">def</span> <span class="n">say_goodbye</span><span class="p">(</span><span class="n">name</span><span class="p">),</span> <span class="k">do</span><span class="p">:</span> <span class="no">IO</span><span class="o">.</span><span class="n">puts</span> <span class="s2">"Goodbye, </span><span class="si">#{</span><span class="n">name</span><span class="si">}</span><span class="s2">"</span> <span class="k">end</span> <span class="k">defmodule</span> <span class="no">ExcitedGreeter</span> <span class="k">do</span> <span class="nv">@behaviour</span> <span class="no">Greeter</span> <span class="k">def</span> <span class="n">say_hello</span><span class="p">(</span><span class="n">name</span><span class="p">),</span> <span class="k">do</span><span class="p">:</span> <span class="no">IO</span><span class="o">.</span><span class="n">puts</span> <span class="s2">"Hello, </span><span class="si">#{</span><span class="n">name</span><span class="si">}</span><span class="s2">!!"</span> <span class="k">def</span> <span class="n">say_goodbye</span><span class="p">(</span><span class="n">name</span><span class="p">),</span> <span class="k">do</span><span class="p">:</span> <span class="no">IO</span><span class="o">.</span><span class="n">puts</span> <span class="s2">"Goodbye, </span><span class="si">#{</span><span class="n">name</span><span class="si">}</span><span class="s2">!!"</span> <span class="k">end</span> <span class="c1"># Since the following module does not implement say_goodbye/1</span> <span class="c1"># a compile time warning will occur:</span> <span class="c1"># "warning: undefined behaviour function say_goodbye/1 (for behaviour Greeter)"</span> <span class="k">defmodule</span> <span class="no">InvalidGreeter</span> <span class="k">do</span> <span class="nv">@behaviour</span> <span class="no">Greeter</span> <span class="k">def</span> <span class="n">say_hello</span><span class="p">(</span><span class="n">name</span><span class="p">),</span> <span class="k">do</span><span class="p">:</span> <span class="no">IO</span><span class="o">.</span><span class="n">puts</span> <span class="s2">"Hello, </span><span class="si">#{</span><span class="n">name</span><span class="si">}</span><span class="s2">."</span> <span class="k">end</span></code></pre></figure> <p>Documentation: <a href="http://elixir-lang.org/getting-started/typespecs-and-behaviours.html#behaviours">Behaviours</a></p> Thu, 17 Mar 2016 14:10:58 +0000 https://elixir-examples.github.io/examples/behaviours https://elixir-examples.github.io/examples/behaviours Kernel