Sophie

Sophie

distrib > Mageia > 7 > i586 > media > core-release > by-pkgid > 016232f1d9a3f7bee85855d35a2bca58 > files > 81

elixir-doc-1.7.2-1.mga7.noarch.rpm

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="x-ua-compatible" content="ie=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="generator" content="ExDoc v0.19.1">
    <title>Kernel – Elixir v1.7.2</title>
    <link rel="stylesheet" href="dist/app-240d7fc7e5.css" />
      <link rel="canonical" href="https://hexdocs.pm/elixir/v1.7/Kernel.html" />
    <script src="dist/sidebar_items-cdf4e58b19.js"></script>
    
  </head>
  <body data-type="modules">
    <script>try { if(localStorage.getItem('night-mode')) document.body.className += ' night-mode'; } catch (e) { }</script>
    <div class="main">
<button class="sidebar-button sidebar-toggle">
  <span class="icon-menu" aria-hidden="true"></span>
  <span class="sr-only">Toggle Sidebar</span>
</button>
<button class="sidebar-button night-mode-toggle">
  <span class="icon-theme" aria-hidden="true"></span>
  <span class="sr-only">Toggle Theme</span>
</button>
<section class="sidebar">

  <a href="http://elixir-lang.org/docs.html" class="sidebar-projectLink">
    <div class="sidebar-projectDetails">
      <h1 class="sidebar-projectName">
Elixir      </h1>
      <h2 class="sidebar-projectVersion">
        v1.7.2
      </h2>
    </div>
      <img src="assets/logo.png" alt="Elixir" class="sidebar-projectImage">
  </a>

  <form class="sidebar-search" action="search.html">
    <button type="submit" class="search-button">
      <span class="icon-search" aria-hidden="true"></span>
    </button>
    <input name="q" type="text" id="search-list" class="search-input" placeholder="Search" aria-label="Search" autocomplete="off" />
  </form>

  <ul class="sidebar-listNav">
    <li><a id="extras-list" href="#full-list">Pages</a></li>

      <li><a id="modules-list" href="#full-list">Modules</a></li>

      <li><a id="exceptions-list" href="#full-list">Exceptions</a></li>

  </ul>
  <div class="gradient"></div>
  <ul id="full-list" class="sidebar-fullList"></ul>
</section>

<section class="content">
  <div class="content-outer">
    <div id="content" class="content-inner">


      <h1>
        <small class="visible-xs">Elixir v1.7.2</small>
Kernel        
          <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L9" title="View Source" class="view-source" rel="help">
            <span class="icon-code" aria-hidden="true"></span>
            <span class="sr-only">View Source</span>
          </a>
      </h1>


        <section id="moduledoc">
<p><a href="Kernel.html#content"><code class="inline">Kernel</code></a> is Elixir’s default environment.</p>
<p>It mainly consists of:</p>
<ul>
<li>basic language primitives, such as arithmetic operators, spawning of processes,
data type handling, etc
</li>
<li>macros for control-flow and defining new functionality (modules, functions, and so on)
</li>
<li><a href="guards.html">guard</a> checks for augmenting pattern matching
</li>
</ul>
<p>You can use <a href="Kernel.html#content"><code class="inline">Kernel</code></a> functions/macros without the <a href="Kernel.html#content"><code class="inline">Kernel</code></a> prefix anywhere in
Elixir code as all its functions and macros are automatically imported. For
example, in IEx:</p>
<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">is_number</span><span class="p" data-group-id="1762149913-1">(</span><span class="mi">13</span><span class="p" data-group-id="1762149913-1">)</span><span class="w">
</span><span class="no">true</span></code></pre>
<p>If you don’t want to import a function or macro from <a href="Kernel.html#content"><code class="inline">Kernel</code></a>, use the <code class="inline">:except</code>
option and then list the function/macro by arity:</p>
<pre><code class="nohighlight makeup elixir"><span class="kn">import</span><span class="w"> </span><span class="nc">Kernel</span><span class="p">,</span><span class="w"> </span><span class="ss">except</span><span class="p">:</span><span class="w"> </span><span class="p" data-group-id="1383742024-1">[</span><span class="ss">if</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="ss">unless</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p" data-group-id="1383742024-1">]</span></code></pre>
<p>See <a href="Kernel.SpecialForms.html#import/2"><code class="inline">Kernel.SpecialForms.import/2</code></a> for more information on importing.</p>
<p>Elixir also has special forms that are always imported and
cannot be skipped. These are described in <a href="Kernel.SpecialForms.html"><code class="inline">Kernel.SpecialForms</code></a>.</p>
<h2 id="module-the-standard-library" class="section-heading">
  <a href="#module-the-standard-library" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  The standard library
</h2>

<p><a href="Kernel.html#content"><code class="inline">Kernel</code></a> provides the basic capabilities the Elixir standard library
is built on top of. It is recommended to explore the standard library
for advanced functionality. Here are the main groups of modules in the
standard library (this list is not a complete reference, see the
documentation sidebar for all entries).</p>
<h3 id="module-built-in-types" class="section-heading">
  <a href="#module-built-in-types" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Built-in types
</h3>

<p>The following modules handle Elixir built-in data types:</p>
<ul>
<li><a href="Atom.html"><code class="inline">Atom</code></a> - literal constants with a name (<code class="inline">true</code>, <code class="inline">false</code>, and <code class="inline">nil</code> are atoms)
</li>
<li><a href="Float.html"><code class="inline">Float</code></a> - numbers with floating point precision
</li>
<li><a href="Function.html"><code class="inline">Function</code></a> - a reference to code chunk, created with the <a href="https://hexdocs.pm/elixir/Kernel.SpecialForms.html#fn/2"><code class="inline">Kernel.SpecialForms.fn/2</code></a>
special form
</li>
<li><a href="Integer.html"><code class="inline">Integer</code></a> - whole numbers (not fractions)
</li>
<li><a href="List.html"><code class="inline">List</code></a> - collections of a variable number of elements (linked lists)
</li>
<li><a href="Map.html"><code class="inline">Map</code></a> - collections of key-value pairs
</li>
<li><a href="Process.html"><code class="inline">Process</code></a> - light-weight threads of execution
</li>
<li><a href="Port.html"><code class="inline">Port</code></a> - mechanisms to interact with the external world
</li>
<li><a href="Tuple.html"><code class="inline">Tuple</code></a> - collections of a fixed number of elements
</li>
</ul>
<p>There are two data types without an accompanying module:</p>
<ul>
<li>Bitstring - a sequence of bits, created with <a href="Kernel.SpecialForms.html#%253C%253C%253E%253E/1"><code class="inline">Kernel.SpecialForms.&lt;&lt;&gt;&gt;/1</code></a>.
When the number of bits is divisible by 8, they are called binaries and can
be manipulated with Erlang’s <code class="inline">:binary</code> module
</li>
<li>Reference - a unique value in the runtime system, created with <a href="#make_ref/0"><code class="inline">make_ref/0</code></a>
</li>
</ul>
<h3 id="module-data-types" class="section-heading">
  <a href="#module-data-types" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Data types
</h3>

<p>Elixir also provides other data types that are built on top of the types
listed above. Some of them are:</p>
<ul>
<li><a href="Date.html"><code class="inline">Date</code></a> - <code class="inline">year-month-day</code> structs in a given calendar
</li>
<li><a href="DateTime.html"><code class="inline">DateTime</code></a> - date and time with time zone in a given calendar
</li>
<li><a href="Exception.html"><code class="inline">Exception</code></a> - data raised from errors and unexpected scenarios
</li>
<li><a href="MapSet.html"><code class="inline">MapSet</code></a> - unordered collections of unique elements
</li>
<li><a href="NaiveDateTime.html"><code class="inline">NaiveDateTime</code></a> - date and time without time zone in a given calendar
</li>
<li><a href="Keyword.html"><code class="inline">Keyword</code></a> - lists of two-element tuples, often representing optional values
</li>
<li><a href="Range.html"><code class="inline">Range</code></a> - inclusive ranges between two integers
</li>
<li><a href="Regex.html"><code class="inline">Regex</code></a> - regular expressions
</li>
<li><a href="String.html"><code class="inline">String</code></a> - UTF-8 encoded binaries representing characters
</li>
<li><a href="Time.html"><code class="inline">Time</code></a> - <code class="inline">hour:minute:second</code> structs in a given calendar
</li>
<li><a href="URI.html"><code class="inline">URI</code></a> - representation of URIs that identify resources
</li>
<li><a href="Version.html"><code class="inline">Version</code></a> - representation of versions and requirements
</li>
</ul>
<h3 id="module-system-modules" class="section-heading">
  <a href="#module-system-modules" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  System modules
</h3>

<p>Modules that interface with the underlying system, such as:</p>
<ul>
<li><a href="IO.html"><code class="inline">IO</code></a> - handles input and output
</li>
<li><a href="File.html"><code class="inline">File</code></a> - interacts with the underlying file system
</li>
<li><a href="Path.html"><code class="inline">Path</code></a> - manipulates file system paths
</li>
<li><a href="System.html"><code class="inline">System</code></a> - reads and writes system information
</li>
</ul>
<h3 id="module-protocols" class="section-heading">
  <a href="#module-protocols" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Protocols
</h3>

<p>Protocols add polymorphic dispatch to Elixir. They are contracts
implementable by data types. See <a href="#defprotocol/2"><code class="inline">defprotocol/2</code></a> for more information on
protocols. Elixir provides the following protocols in the standard library:</p>
<ul>
<li><a href="Collectable.html"><code class="inline">Collectable</code></a> - collects data into a data type
</li>
<li><a href="Enumerable.html"><code class="inline">Enumerable</code></a> - handles collections in Elixir. The <a href="Enum.html"><code class="inline">Enum</code></a> module
provides eager functions for working with collections, the <a href="Stream.html"><code class="inline">Stream</code></a>
module provides lazy functions
</li>
<li><a href="Inspect.html"><code class="inline">Inspect</code></a> - converts data types into their programming language
representation
</li>
<li><a href="List.Chars.html"><code class="inline">List.Chars</code></a> - converts data types to their outside world
representation as char lists (non-programming based)
</li>
<li><a href="String.Chars.html"><code class="inline">String.Chars</code></a> - converts data types to their outside world
representation as strings (non-programming based)
</li>
</ul>
<h3 id="module-process-based-and-application-centric-functionality" class="section-heading">
  <a href="#module-process-based-and-application-centric-functionality" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Process-based and application-centric functionality
</h3>

<p>The following modules build on top of processes to provide concurrency,
fault-tolerance, and more.</p>
<ul>
<li><a href="Agent.html"><code class="inline">Agent</code></a> - a process that encapsulates mutable state
</li>
<li><a href="Application.html"><code class="inline">Application</code></a> - functions for starting, stopping and configuring
applications
</li>
<li><a href="GenServer.html"><code class="inline">GenServer</code></a> - a generic client-server API
</li>
<li><a href="Registry.html"><code class="inline">Registry</code></a> - a key-value process-based storage
</li>
<li><a href="Supervisor.html"><code class="inline">Supervisor</code></a> - a process that is responsible for starting,
supervising and shutting down other processes
</li>
<li><a href="Task.html"><code class="inline">Task</code></a> - a process that performs computations
</li>
<li><a href="Task.Supervisor.html"><code class="inline">Task.Supervisor</code></a> - a supervisor for managing tasks exclusively
</li>
</ul>
<h3 id="module-supporting-documents" class="section-heading">
  <a href="#module-supporting-documents" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Supporting documents
</h3>

<p>Elixir documentation also includes supporting documents under the
“Pages” section. Those are:</p>
<ul>
<li><a href="compatibility-and-deprecations.html">Compatibility and Deprecations</a> - lists compatibility
between every Elixir version and Erlang/OTP, release schema; lists all deprecated functions,
when they were deprecated and alternatives
</li>
<li><a href="guards.html">Guards</a> - lists all available guards and extensions
</li>
<li><a href="library-guidelines.html">Library Guidelines</a> - general guidelines, anti-patterns, and rules
for those writing libraries
</li>
<li><a href="naming-conventions.html">Naming Conventions</a> - naming conventions
for Elixir code
</li>
<li><a href="operators.html">Operators</a> - lists all Elixir operators and their
precedence
</li>
<li><a href="syntax-reference.html">Syntax Reference</a> - the language syntax reference
</li>
<li><a href="typespecs.html">Typespecs</a>- types and function specifications, including list of types
</li>
<li><a href="unicode-syntax.html">Unicode Syntax</a> - outlines Elixir support for Unicode
</li>
<li><a href="writing-documentation.html">Writing Documentation</a> - guidelines for
writing documentation in Elixir.
</li>
</ul>
<h2 id="module-inlining" class="section-heading">
  <a href="#module-inlining" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Inlining
</h2>

<p>Some of the functions described in this module are inlined by
the Elixir compiler into their Erlang counterparts in the
<a href="http://www.erlang.org/doc/man/erlang.html"><code class="inline">:erlang</code> module</a>.
Those functions are called BIFs (built-in internal functions)
in Erlang-land and they exhibit interesting properties, as some
of them are allowed in guards and others are used for compiler
optimizations.</p>
<p>Most of the inlined functions can be seen in effect when
capturing the function:</p>
<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="o">&amp;</span><span class="nc">Kernel</span><span class="o">.</span><span class="n">is_atom</span><span class="o">/</span><span class="mi">1</span><span class="w">
</span><span class="o">&amp;</span><span class="ss">:erlang</span><span class="o">.</span><span class="n">is_atom</span><span class="o">/</span><span class="mi">1</span></code></pre>
<p>Those functions will be explicitly marked in their docs as
“inlined by the compiler”.</p>
        </section>

        <section id="summary" class="details-list">
          <h1 class="section-heading">
            <a class="hover-link" href="#summary">
              <span class="icon-link" aria-hidden="true"></span>
              <span class="sr-only">Link to this section</span>
            </a>
            Summary
          </h1>
          
  <div class="summary-functions summary">
    <h2>
      <a href="#functions">Functions</a>
    </h2>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#!/1">!value</a>
  </div>
    <div class="summary-synopsis"><p>Boolean not</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#!=/2">left != right</a>
  </div>
    <div class="summary-synopsis"><p>Returns <code class="inline">true</code> if the two items are not equal</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#!==/2">left !== right</a>
  </div>
    <div class="summary-synopsis"><p>Returns <code class="inline">true</code> if the two items are not exactly equal</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#&amp;&amp;/2">left &amp;&amp; right</a>
  </div>
    <div class="summary-synopsis"><p>Provides a short-circuit operator that evaluates and returns
the second expression only if the first one evaluates to <code class="inline">true</code>
(i.e., it is neither <code class="inline">nil</code> nor <code class="inline">false</code>). Returns the first expression
otherwise</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#*/2">left * right</a>
  </div>
    <div class="summary-synopsis"><p>Arithmetic multiplication</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#++/2">left ++ right</a>
  </div>
    <div class="summary-synopsis"><p>Concatenates a proper list and a term, returning a list</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#+/1">+value</a>
  </div>
    <div class="summary-synopsis"><p>Arithmetic unary plus</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#+/2">left + right</a>
  </div>
    <div class="summary-synopsis"><p>Arithmetic addition</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#--/2">left -- right</a>
  </div>
    <div class="summary-synopsis"><p>Removes the first occurrence of an item on the left list
for each item on the right</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#-/1">-value</a>
  </div>
    <div class="summary-synopsis"><p>Arithmetic unary minus</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#-/2">left - right</a>
  </div>
    <div class="summary-synopsis"><p>Arithmetic subtraction</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#../2">first..last</a>
  </div>
    <div class="summary-synopsis"><p>Returns a range with the specified <code class="inline">first</code> and <code class="inline">last</code> integers</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#//2">left / right</a>
  </div>
    <div class="summary-synopsis"><p>Arithmetic division</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#%3C/2">left &lt; right</a>
  </div>
    <div class="summary-synopsis"><p>Returns <code class="inline">true</code> if left is less than right</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#%3C=/2">left &lt;= right</a>
  </div>
    <div class="summary-synopsis"><p>Returns <code class="inline">true</code> if left is less than or equal to right</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#%3C%3E/2">left &lt;&gt; right</a>
  </div>
    <div class="summary-synopsis"><p>Concatenates two binaries</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#==/2">left == right</a>
  </div>
    <div class="summary-synopsis"><p>Returns <code class="inline">true</code> if the two items are equal</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#===/2">left === right</a>
  </div>
    <div class="summary-synopsis"><p>Returns <code class="inline">true</code> if the two items are exactly equal</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#=~/2">left =~ right</a>
  </div>
    <div class="summary-synopsis"><p>Matches the term on the left against the regular expression or string on the
right</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#%3E/2">left &gt; right</a>
  </div>
    <div class="summary-synopsis"><p>Returns <code class="inline">true</code> if left is more than right</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#%3E=/2">left &gt;= right</a>
  </div>
    <div class="summary-synopsis"><p>Returns <code class="inline">true</code> if left is more than or equal to right</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#@/1">@expr</a>
  </div>
    <div class="summary-synopsis"><p>Reads and writes attributes of the current module</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#abs/1">abs(number)</a>
  </div>
    <div class="summary-synopsis"><p>Returns an integer or float which is the arithmetical absolute value of <code class="inline">number</code></p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#alias!/1">alias!(alias)</a>
  </div>
    <div class="summary-synopsis"><p>When used inside quoting, marks that the given alias should not
be hygienized. This means the alias will be expanded when
the macro is expanded</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#and/2">left and right</a>
  </div>
    <div class="summary-synopsis"><p>Boolean and</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#apply/2">apply(fun, args)</a>
  </div>
    <div class="summary-synopsis"><p>Invokes the given anonymous function <code class="inline">fun</code> with the list of
arguments <code class="inline">args</code></p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#apply/3">apply(module, function_name, args)</a>
  </div>
    <div class="summary-synopsis"><p>Invokes the given function from <code class="inline">module</code> with the list of
arguments <code class="inline">args</code></p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#binary_part/3">binary_part(binary, start, length)</a>
  </div>
    <div class="summary-synopsis"><p>Extracts the part of the binary starting at <code class="inline">start</code> with length <code class="inline">length</code>.
Binaries are zero-indexed</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#binding/1">binding(context \\ nil)</a>
  </div>
    <div class="summary-synopsis"><p>Returns the binding for the given context as a keyword list</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#bit_size/1">bit_size(bitstring)</a>
  </div>
    <div class="summary-synopsis"><p>Returns an integer which is the size in bits of <code class="inline">bitstring</code></p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#byte_size/1">byte_size(bitstring)</a>
  </div>
    <div class="summary-synopsis"><p>Returns the number of bytes needed to contain <code class="inline">bitstring</code></p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#def/2">def(call, expr \\ nil)</a>
  </div>
    <div class="summary-synopsis"><p>Defines a function with the given name and body</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#defdelegate/2">defdelegate(funs, opts)</a>
  </div>
    <div class="summary-synopsis"><p>Defines a function that delegates to another module</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#defexception/1">defexception(fields)</a>
  </div>
    <div class="summary-synopsis"><p>Defines an exception</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#defguard/1">defguard(guard)</a>
  </div>
    <div class="summary-synopsis"><p>Generates a macro suitable for use in guard expressions</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#defguardp/1">defguardp(guard)</a>
  </div>
    <div class="summary-synopsis"><p>Generates a private macro suitable for use in guard expressions</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#defimpl/3">defimpl(name, opts, do_block \\ [])</a>
  </div>
    <div class="summary-synopsis"><p>Defines an implementation for the given protocol</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#defmacro/2">defmacro(call, expr \\ nil)</a>
  </div>
    <div class="summary-synopsis"><p>Defines a macro with the given name and body</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#defmacrop/2">defmacrop(call, expr \\ nil)</a>
  </div>
    <div class="summary-synopsis"><p>Defines a private macro with the given name and body</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#defmodule/2">defmodule(alias, do_block)</a>
  </div>
    <div class="summary-synopsis"><p>Defines a module given by name with the given contents</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#defoverridable/1">defoverridable(keywords_or_behaviour)</a>
  </div>
    <div class="summary-synopsis"><p>Makes the given functions in the current module overridable</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#defp/2">defp(call, expr \\ nil)</a>
  </div>
    <div class="summary-synopsis"><p>Defines a private function with the given name and body</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#defprotocol/2">defprotocol(name, do_block)</a>
  </div>
    <div class="summary-synopsis"><p>Defines a protocol</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#defstruct/1">defstruct(fields)</a>
  </div>
    <div class="summary-synopsis"><p>Defines a struct</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#destructure/2">destructure(left, right)</a>
  </div>
    <div class="summary-synopsis"><p>Destructures two lists, assigning each term in the
right one to the matching term in the left one</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#div/2">div(dividend, divisor)</a>
  </div>
    <div class="summary-synopsis"><p>Performs an integer division</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#elem/2">elem(tuple, index)</a>
  </div>
    <div class="summary-synopsis"><p>Gets the element at the zero-based <code class="inline">index</code> in <code class="inline">tuple</code></p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#exit/1">exit(reason)</a>
  </div>
    <div class="summary-synopsis"><p>Stops the execution of the calling process with the given reason</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#function_exported?/3">function_exported?(module, function, arity)</a>
  </div>
    <div class="summary-synopsis"><p>Returns <code class="inline">true</code> if <code class="inline">module</code> is loaded and contains a
public <code class="inline">function</code> with the given <code class="inline">arity</code>, otherwise <code class="inline">false</code></p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#get_and_update_in/2">get_and_update_in(path, fun)</a>
  </div>
    <div class="summary-synopsis"><p>Gets a value and updates a nested data structure via the given <code class="inline">path</code></p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#get_and_update_in/3">get_and_update_in(data, keys, fun)</a>
  </div>
    <div class="summary-synopsis"><p>Gets a value and updates a nested structure</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#get_in/2">get_in(data, keys)</a>
  </div>
    <div class="summary-synopsis"><p>Gets a value from a nested structure</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#hd/1">hd(list)</a>
  </div>
    <div class="summary-synopsis"><p>Returns the head of a list. Raises <a href="ArgumentError.html"><code class="inline">ArgumentError</code></a> if the list is empty</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#if/2">if(condition, clauses)</a>
  </div>
    <div class="summary-synopsis"><p>Provides an <a href="#if/2"><code class="inline">if/2</code></a> macro</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#in/2">left in right</a>
  </div>
    <div class="summary-synopsis"><p>Checks if the element on the left-hand side is a member of the
collection on the right-hand side</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#inspect/2">inspect(term, opts \\ [])</a>
  </div>
    <div class="summary-synopsis"><p>Inspects the given argument according to the <a href="Inspect.html"><code class="inline">Inspect</code></a> protocol.
The second argument is a keyword list with options to control
inspection</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#is_atom/1">is_atom(term)</a>
  </div>
    <div class="summary-synopsis"><p>Returns <code class="inline">true</code> if <code class="inline">term</code> is an atom; otherwise returns <code class="inline">false</code></p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#is_binary/1">is_binary(term)</a>
  </div>
    <div class="summary-synopsis"><p>Returns <code class="inline">true</code> if <code class="inline">term</code> is a binary; otherwise returns <code class="inline">false</code></p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#is_bitstring/1">is_bitstring(term)</a>
  </div>
    <div class="summary-synopsis"><p>Returns <code class="inline">true</code> if <code class="inline">term</code> is a bitstring (including a binary); otherwise returns <code class="inline">false</code></p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#is_boolean/1">is_boolean(term)</a>
  </div>
    <div class="summary-synopsis"><p>Returns <code class="inline">true</code> if <code class="inline">term</code> is either the atom <code class="inline">true</code> or the atom <code class="inline">false</code> (i.e.,
a boolean); otherwise returns <code class="inline">false</code></p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#is_float/1">is_float(term)</a>
  </div>
    <div class="summary-synopsis"><p>Returns <code class="inline">true</code> if <code class="inline">term</code> is a floating-point number; otherwise returns <code class="inline">false</code></p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#is_function/1">is_function(term)</a>
  </div>
    <div class="summary-synopsis"><p>Returns <code class="inline">true</code> if <code class="inline">term</code> is a function; otherwise returns <code class="inline">false</code></p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#is_function/2">is_function(term, arity)</a>
  </div>
    <div class="summary-synopsis"><p>Returns <code class="inline">true</code> if <code class="inline">term</code> is a function that can be applied with <code class="inline">arity</code> number of arguments;
otherwise returns <code class="inline">false</code></p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#is_integer/1">is_integer(term)</a>
  </div>
    <div class="summary-synopsis"><p>Returns <code class="inline">true</code> if <code class="inline">term</code> is an integer; otherwise returns <code class="inline">false</code></p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#is_list/1">is_list(term)</a>
  </div>
    <div class="summary-synopsis"><p>Returns <code class="inline">true</code> if <code class="inline">term</code> is a list with zero or more elements; otherwise returns <code class="inline">false</code></p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#is_map/1">is_map(term)</a>
  </div>
    <div class="summary-synopsis"><p>Returns <code class="inline">true</code> if <code class="inline">term</code> is a map; otherwise returns <code class="inline">false</code></p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#is_nil/1">is_nil(term)</a>
  </div>
    <div class="summary-synopsis"><p>Returns <code class="inline">true</code> if <code class="inline">term</code> is <code class="inline">nil</code>, <code class="inline">false</code> otherwise</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#is_number/1">is_number(term)</a>
  </div>
    <div class="summary-synopsis"><p>Returns <code class="inline">true</code> if <code class="inline">term</code> is either an integer or a floating-point number;
otherwise returns <code class="inline">false</code></p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#is_pid/1">is_pid(term)</a>
  </div>
    <div class="summary-synopsis"><p>Returns <code class="inline">true</code> if <code class="inline">term</code> is a PID (process identifier); otherwise returns <code class="inline">false</code></p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#is_port/1">is_port(term)</a>
  </div>
    <div class="summary-synopsis"><p>Returns <code class="inline">true</code> if <code class="inline">term</code> is a port identifier; otherwise returns <code class="inline">false</code></p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#is_reference/1">is_reference(term)</a>
  </div>
    <div class="summary-synopsis"><p>Returns <code class="inline">true</code> if <code class="inline">term</code> is a reference; otherwise returns <code class="inline">false</code></p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#is_tuple/1">is_tuple(term)</a>
  </div>
    <div class="summary-synopsis"><p>Returns <code class="inline">true</code> if <code class="inline">term</code> is a tuple; otherwise returns <code class="inline">false</code></p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#length/1">length(list)</a>
  </div>
    <div class="summary-synopsis"><p>Returns the length of <code class="inline">list</code></p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#macro_exported?/3">macro_exported?(module, macro, arity)</a>
  </div>
    <div class="summary-synopsis"><p>Returns <code class="inline">true</code> if <code class="inline">module</code> is loaded and contains a
public <code class="inline">macro</code> with the given <code class="inline">arity</code>, otherwise <code class="inline">false</code></p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#make_ref/0">make_ref()</a>
  </div>
    <div class="summary-synopsis"><p>Returns an almost unique reference</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#map_size/1">map_size(map)</a>
  </div>
    <div class="summary-synopsis"><p>Returns the size of a map</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#match?/2">match?(pattern, expr)</a>
  </div>
    <div class="summary-synopsis"><p>A convenience macro that checks if the right side (an expression) matches the
left side (a pattern)</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#max/2">max(first, second)</a>
  </div>
    <div class="summary-synopsis"><p>Returns the biggest of the two given terms according to
Erlang’s term ordering</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#min/2">min(first, second)</a>
  </div>
    <div class="summary-synopsis"><p>Returns the smallest of the two given terms according to
Erlang’s term ordering</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#node/0">node()</a>
  </div>
    <div class="summary-synopsis"><p>Returns an atom representing the name of the local node.
If the node is not alive, <code class="inline">:nonode@nohost</code> is returned instead</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#node/1">node(arg)</a>
  </div>
    <div class="summary-synopsis"><p>Returns the node where the given argument is located.
The argument can be a PID, a reference, or a port.
If the local node is not alive, <code class="inline">:nonode@nohost</code> is returned</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#not/1">not(value)</a>
  </div>
    <div class="summary-synopsis"><p>Boolean not</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#or/2">left or right</a>
  </div>
    <div class="summary-synopsis"><p>Boolean or</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#pop_in/1">pop_in(path)</a>
  </div>
    <div class="summary-synopsis"><p>Pops a key from the nested structure via the given <code class="inline">path</code></p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#pop_in/2">pop_in(data, keys)</a>
  </div>
    <div class="summary-synopsis"><p>Pops a key from the given nested structure</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#put_elem/3">put_elem(tuple, index, value)</a>
  </div>
    <div class="summary-synopsis"><p>Puts <code class="inline">value</code> at the given zero-based <code class="inline">index</code> in <code class="inline">tuple</code></p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#put_in/2">put_in(path, value)</a>
  </div>
    <div class="summary-synopsis"><p>Puts a value in a nested structure via the given <code class="inline">path</code></p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#put_in/3">put_in(data, keys, value)</a>
  </div>
    <div class="summary-synopsis"><p>Puts a value in a nested structure</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#raise/1">raise(message)</a>
  </div>
    <div class="summary-synopsis"><p>Raises an exception</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#raise/2">raise(exception, attributes)</a>
  </div>
    <div class="summary-synopsis"><p>Raises an exception</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#rem/2">rem(dividend, divisor)</a>
  </div>
    <div class="summary-synopsis"><p>Computes the remainder of an integer division</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#reraise/2">reraise(message, stacktrace)</a>
  </div>
    <div class="summary-synopsis"><p>Raises an exception preserving a previous stacktrace</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#reraise/3">reraise(exception, attributes, stacktrace)</a>
  </div>
    <div class="summary-synopsis"><p>Raises an exception preserving a previous stacktrace</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#round/1">round(number)</a>
  </div>
    <div class="summary-synopsis"><p>Rounds a number to the nearest integer</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#self/0">self()</a>
  </div>
    <div class="summary-synopsis"><p>Returns the PID (process identifier) of the calling process</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#send/2">send(dest, message)</a>
  </div>
    <div class="summary-synopsis"><p>Sends a message to the given <code class="inline">dest</code> and returns the message</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#sigil_C/2">sigil_C(term, modifiers)</a>
  </div>
    <div class="summary-synopsis"><p>Handles the sigil <code class="inline">~C</code> for charlists</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#sigil_D/2">sigil_D(date, modifiers)</a>
  </div>
    <div class="summary-synopsis"><p>Handles the sigil <code class="inline">~D</code> for dates</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#sigil_N/2">sigil_N(date, modifiers)</a>
  </div>
    <div class="summary-synopsis"><p>Handles the sigil <code class="inline">~N</code> for naive date times</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#sigil_R/2">sigil_R(term, modifiers)</a>
  </div>
    <div class="summary-synopsis"><p>Handles the sigil <code class="inline">~R</code> for regular expressions</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#sigil_S/2">sigil_S(term, modifiers)</a>
  </div>
    <div class="summary-synopsis"><p>Handles the sigil <code class="inline">~S</code> for strings</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#sigil_T/2">sigil_T(date, modifiers)</a>
  </div>
    <div class="summary-synopsis"><p>Handles the sigil <code class="inline">~T</code> for times</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#sigil_W/2">sigil_W(term, modifiers)</a>
  </div>
    <div class="summary-synopsis"><p>Handles the sigil <code class="inline">~W</code> for list of words</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#sigil_c/2">sigil_c(term, modifiers)</a>
  </div>
    <div class="summary-synopsis"><p>Handles the sigil <code class="inline">~c</code> for charlists</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#sigil_r/2">sigil_r(term, modifiers)</a>
  </div>
    <div class="summary-synopsis"><p>Handles the sigil <code class="inline">~r</code> for regular expressions</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#sigil_s/2">sigil_s(term, modifiers)</a>
  </div>
    <div class="summary-synopsis"><p>Handles the sigil <code class="inline">~s</code> for strings</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#sigil_w/2">sigil_w(term, modifiers)</a>
  </div>
    <div class="summary-synopsis"><p>Handles the sigil <code class="inline">~w</code> for list of words</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#spawn/1">spawn(fun)</a>
  </div>
    <div class="summary-synopsis"><p>Spawns the given function and returns its PID</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#spawn/3">spawn(module, fun, args)</a>
  </div>
    <div class="summary-synopsis"><p>Spawns the given function <code class="inline">fun</code> from the given <code class="inline">module</code> passing it the given
<code class="inline">args</code> and returns its PID</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#spawn_link/1">spawn_link(fun)</a>
  </div>
    <div class="summary-synopsis"><p>Spawns the given function, links it to the current process, and returns its PID</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#spawn_link/3">spawn_link(module, fun, args)</a>
  </div>
    <div class="summary-synopsis"><p>Spawns the given function <code class="inline">fun</code> from the given <code class="inline">module</code> passing it the given
<code class="inline">args</code>, links it to the current process, and returns its PID</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#spawn_monitor/1">spawn_monitor(fun)</a>
  </div>
    <div class="summary-synopsis"><p>Spawns the given function, monitors it and returns its PID
and monitoring reference</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#spawn_monitor/3">spawn_monitor(module, fun, args)</a>
  </div>
    <div class="summary-synopsis"><p>Spawns the given module and function passing the given args,
monitors it and returns its PID and monitoring reference</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#struct!/2">struct!(struct, fields \\ [])</a>
  </div>
    <div class="summary-synopsis"><p>Similar to <a href="#struct/2"><code class="inline">struct/2</code></a> but checks for key validity</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#struct/2">struct(struct, fields \\ [])</a>
  </div>
    <div class="summary-synopsis"><p>Creates and updates structs</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#throw/1">throw(term)</a>
  </div>
    <div class="summary-synopsis"><p>A non-local return from a function</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#tl/1">tl(list)</a>
  </div>
    <div class="summary-synopsis"><p>Returns the tail of a list. Raises <a href="ArgumentError.html"><code class="inline">ArgumentError</code></a> if the list is empty</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#to_charlist/1">to_charlist(term)</a>
  </div>
    <div class="summary-synopsis"><p>Converts the given term to a charlist according to the <a href="List.Chars.html"><code class="inline">List.Chars</code></a> protocol</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#to_string/1">to_string(term)</a>
  </div>
    <div class="summary-synopsis"><p>Converts the argument to a string according to the
<a href="String.Chars.html"><code class="inline">String.Chars</code></a> protocol</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#trunc/1">trunc(number)</a>
  </div>
    <div class="summary-synopsis"><p>Returns the integer part of <code class="inline">number</code></p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#tuple_size/1">tuple_size(tuple)</a>
  </div>
    <div class="summary-synopsis"><p>Returns the size of a tuple</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#unless/2">unless(condition, clauses)</a>
  </div>
    <div class="summary-synopsis"><p>Provides an <code class="inline">unless</code> macro</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#update_in/2">update_in(path, fun)</a>
  </div>
    <div class="summary-synopsis"><p>Updates a nested structure via the given <code class="inline">path</code></p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#update_in/3">update_in(data, keys, fun)</a>
  </div>
    <div class="summary-synopsis"><p>Updates a key in a nested structure</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#use/2">use(module, opts \\ [])</a>
  </div>
    <div class="summary-synopsis"><p>Uses the given module in the current context</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#var!/2">var!(var, context \\ nil)</a>
  </div>
    <div class="summary-synopsis"><p>When used inside quoting, marks that the given variable should
not be hygienized</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#%7C%3E/2">left |&gt; right</a>
  </div>
    <div class="summary-synopsis"><p>Pipe operator</p>
</div>
</div>
<div class="summary-row">
  <div class="summary-signature">
    <a href="#%7C%7C/2">left || right</a>
  </div>
    <div class="summary-synopsis"><p>Provides a short-circuit operator that evaluates and returns the second
expression only if the first one does not evaluate to <code class="inline">true</code> (i.e., it
is either <code class="inline">nil</code> or <code class="inline">false</code>). Returns the first expression otherwise</p>
</div>
</div>
  </div>
          
        </section>



        <section id="functions" class="details-list">
          <h1 class="section-heading">
            <a class="hover-link" href="#functions">
              <span class="icon-link" aria-hidden="true"></span>
              <span class="sr-only">Link to this section</span>
            </a>
            Functions
          </h1>
<div class="detail" id="!/1">
    <div class="detail-header">
    <a href="#!/1" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">!value</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L1582" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Boolean not.</p>
<p>Receives any argument (not just booleans) and returns <code class="inline">true</code> if the argument
is <code class="inline">false</code> or <code class="inline">nil</code>; returns <code class="inline">false</code> otherwise.</p>
<p>Not allowed in guard clauses.</p>
<h2 id="!/1-examples" class="section-heading">
  <a href="#!/1-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="o">!</span><span class="nc">Enum</span><span class="o">.</span><span class="n">empty?</span><span class="p" data-group-id="0258703727-1">(</span><span class="p" data-group-id="0258703727-2">[</span><span class="p" data-group-id="0258703727-2">]</span><span class="p" data-group-id="0258703727-1">)</span><span class="w">
</span><span class="no">false</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="o">!</span><span class="nc">List</span><span class="o">.</span><span class="n">first</span><span class="p" data-group-id="0258703727-3">(</span><span class="p" data-group-id="0258703727-4">[</span><span class="p" data-group-id="0258703727-4">]</span><span class="p" data-group-id="0258703727-3">)</span><span class="w">
</span><span class="no">true</span></code></pre>
  </section>
</div>
<div class="detail" id="!=/2">
    <div class="detail-header">
    <a href="#!=/2" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">left != right</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L1386" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre><a href="typespecs.html#built-in-types">term</a>() != <a href="typespecs.html#built-in-types">term</a>() :: <a href="typespecs.html#built-in-types">boolean</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Returns <code class="inline">true</code> if the two items are not equal.</p>
<p>This operator considers 1 and 1.0 to be equal. For match
comparison, use <code class="inline">!==</code> instead.</p>
<p>All terms in Elixir can be compared with each other.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
<h2 id="!=/2-examples" class="section-heading">
  <a href="#!=/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="mi">1</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mi">2</span><span class="w">
</span><span class="no">true</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="mi">1</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mf">1.0</span><span class="w">
</span><span class="no">false</span></code></pre>
  </section>
</div>
<div class="detail" id="!==/2">
    <div class="detail-header">
    <a href="#!==/2" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">left !== right</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L1433" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre><a href="typespecs.html#built-in-types">term</a>() !== <a href="typespecs.html#built-in-types">term</a>() :: <a href="typespecs.html#built-in-types">boolean</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Returns <code class="inline">true</code> if the two items are not exactly equal.</p>
<p>All terms in Elixir can be compared with each other.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
<h2 id="!==/2-examples" class="section-heading">
  <a href="#!==/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="mi">1</span><span class="w"> </span><span class="o">!==</span><span class="w"> </span><span class="mi">2</span><span class="w">
</span><span class="no">true</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="mi">1</span><span class="w"> </span><span class="o">!==</span><span class="w"> </span><span class="mf">1.0</span><span class="w">
</span><span class="no">true</span></code></pre>
  </section>
</div>
<div class="detail" id="&amp;&amp;/2">
    <div class="detail-header">
    <a href="#&amp;&amp;/2" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">left &amp;&amp; right</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L3077" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Provides a short-circuit operator that evaluates and returns
the second expression only if the first one evaluates to <code class="inline">true</code>
(i.e., it is neither <code class="inline">nil</code> nor <code class="inline">false</code>). Returns the first expression
otherwise.</p>
<p>Not allowed in guard clauses.</p>
<h2 id="&amp;&amp;/2-examples" class="section-heading">
  <a href="#&amp;&amp;/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="nc">Enum</span><span class="o">.</span><span class="n">empty?</span><span class="p" data-group-id="5058402582-1">(</span><span class="p" data-group-id="5058402582-2">[</span><span class="p" data-group-id="5058402582-2">]</span><span class="p" data-group-id="5058402582-1">)</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="nc">Enum</span><span class="o">.</span><span class="n">empty?</span><span class="p" data-group-id="5058402582-3">(</span><span class="p" data-group-id="5058402582-4">[</span><span class="p" data-group-id="5058402582-4">]</span><span class="p" data-group-id="5058402582-3">)</span><span class="w">
</span><span class="no">true</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="nc">List</span><span class="o">.</span><span class="n">first</span><span class="p" data-group-id="5058402582-5">(</span><span class="p" data-group-id="5058402582-6">[</span><span class="p" data-group-id="5058402582-6">]</span><span class="p" data-group-id="5058402582-5">)</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="no">true</span><span class="w">
</span><span class="no">nil</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="nc">Enum</span><span class="o">.</span><span class="n">empty?</span><span class="p" data-group-id="5058402582-7">(</span><span class="p" data-group-id="5058402582-8">[</span><span class="p" data-group-id="5058402582-8">]</span><span class="p" data-group-id="5058402582-7">)</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="nc">List</span><span class="o">.</span><span class="n">first</span><span class="p" data-group-id="5058402582-9">(</span><span class="p" data-group-id="5058402582-10">[</span><span class="mi">1</span><span class="p" data-group-id="5058402582-10">]</span><span class="p" data-group-id="5058402582-9">)</span><span class="w">
</span><span class="mi">1</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="no">false</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="k">throw</span><span class="p" data-group-id="5058402582-11">(</span><span class="ss">:bad</span><span class="p" data-group-id="5058402582-11">)</span><span class="w">
</span><span class="no">false</span></code></pre>
<p>Note that, unlike <a href="#and/2"><code class="inline">and/2</code></a>, this operator accepts any expression
as the first argument, not only booleans.</p>
  </section>
</div>
<div class="detail" id="*/2">
    <div class="detail-header">
    <a href="#*/2" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">left * right</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L1154" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre><a href="typespecs.html#basic-types">integer</a>() * <a href="typespecs.html#basic-types">integer</a>() :: <a href="typespecs.html#basic-types">integer</a>()</pre>
          <pre><a href="typespecs.html#basic-types">float</a>() * <a href="typespecs.html#basic-types">float</a>() :: <a href="typespecs.html#basic-types">float</a>()</pre>
          <pre><a href="typespecs.html#basic-types">integer</a>() * <a href="typespecs.html#basic-types">float</a>() :: <a href="typespecs.html#basic-types">float</a>()</pre>
          <pre><a href="typespecs.html#basic-types">float</a>() * <a href="typespecs.html#basic-types">integer</a>() :: <a href="typespecs.html#basic-types">float</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Arithmetic multiplication.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
<h2 id="*/2-examples" class="section-heading">
  <a href="#*/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="mi">1</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">2</span><span class="w">
</span><span class="mi">2</span></code></pre>
  </section>
</div>
<div class="detail" id="++/2">
    <div class="detail-header">
    <a href="#++/2" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">left ++ right</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L1222" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre><a href="typespecs.html#built-in-types">list</a>() ++ <a href="typespecs.html#built-in-types">term</a>() :: <a href="typespecs.html#built-in-types">maybe_improper_list</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Concatenates a proper list and a term, returning a list.</p>
<p>The complexity of <code class="inline">a ++ b</code> is proportional to <code class="inline">length(a)</code>, so avoid repeatedly
appending to lists of arbitrary length, e.g. <code class="inline">list ++ [item]</code>.
Instead, consider prepending via <code class="inline">[item | rest]</code> and then reversing.</p>
<p>If the <code class="inline">right</code> operand is not a proper list, it returns an improper list.
If the <code class="inline">left</code> operand is not a proper list, it raises <a href="ArgumentError.html"><code class="inline">ArgumentError</code></a>.</p>
<p>Inlined by the compiler.</p>
<h2 id="++/2-examples" class="section-heading">
  <a href="#++/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="p" data-group-id="4148576063-1">[</span><span class="mi">1</span><span class="p" data-group-id="4148576063-1">]</span><span class="w"> </span><span class="o">++</span><span class="w"> </span><span class="p" data-group-id="4148576063-2">[</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p" data-group-id="4148576063-2">]</span><span class="w">
</span><span class="p" data-group-id="4148576063-3">[</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p" data-group-id="4148576063-3">]</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="sc">&#39;foo&#39;</span><span class="w"> </span><span class="o">++</span><span class="w"> </span><span class="sc">&#39;bar&#39;</span><span class="w">
</span><span class="sc">&#39;foobar&#39;</span><span class="w">

</span><span class="c1"># returns an improper list</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="p" data-group-id="4148576063-4">[</span><span class="mi">1</span><span class="p" data-group-id="4148576063-4">]</span><span class="w"> </span><span class="o">++</span><span class="w"> </span><span class="mi">2</span><span class="w">
</span><span class="p" data-group-id="4148576063-5">[</span><span class="mi">1</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mi">2</span><span class="p" data-group-id="4148576063-5">]</span><span class="w">

</span><span class="c1"># returns a proper list</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="p" data-group-id="4148576063-6">[</span><span class="mi">1</span><span class="p" data-group-id="4148576063-6">]</span><span class="w"> </span><span class="o">++</span><span class="w"> </span><span class="p" data-group-id="4148576063-7">[</span><span class="mi">2</span><span class="p" data-group-id="4148576063-7">]</span><span class="w">
</span><span class="p" data-group-id="4148576063-8">[</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p" data-group-id="4148576063-8">]</span><span class="w">

</span><span class="c1"># improper list on the right will return an improper list</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="p" data-group-id="4148576063-9">[</span><span class="mi">1</span><span class="p" data-group-id="4148576063-9">]</span><span class="w"> </span><span class="o">++</span><span class="w"> </span><span class="p" data-group-id="4148576063-10">[</span><span class="mi">2</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mi">3</span><span class="p" data-group-id="4148576063-10">]</span><span class="w">
</span><span class="p" data-group-id="4148576063-11">[</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mi">3</span><span class="p" data-group-id="4148576063-11">]</span></code></pre>
  </section>
</div>
<div class="detail" id="+/1">
    <div class="detail-header">
    <a href="#+/1" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">+value</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L1116" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>+value :: value when value: <a href="typespecs.html#built-in-types">number</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Arithmetic unary plus.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
<h2 id="+/1-examples" class="section-heading">
  <a href="#+/1-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="o">+</span><span class="mi">1</span><span class="w">
</span><span class="mi">1</span></code></pre>
  </section>
</div>
<div class="detail" id="+/2">
    <div class="detail-header">
    <a href="#+/2" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">left + right</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L1081" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre><a href="typespecs.html#basic-types">integer</a>() + <a href="typespecs.html#basic-types">integer</a>() :: <a href="typespecs.html#basic-types">integer</a>()</pre>
          <pre><a href="typespecs.html#basic-types">float</a>() + <a href="typespecs.html#basic-types">float</a>() :: <a href="typespecs.html#basic-types">float</a>()</pre>
          <pre><a href="typespecs.html#basic-types">integer</a>() + <a href="typespecs.html#basic-types">float</a>() :: <a href="typespecs.html#basic-types">float</a>()</pre>
          <pre><a href="typespecs.html#basic-types">float</a>() + <a href="typespecs.html#basic-types">integer</a>() :: <a href="typespecs.html#basic-types">float</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Arithmetic addition.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
<h2 id="+/2-examples" class="section-heading">
  <a href="#+/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="mi">1</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">2</span><span class="w">
</span><span class="mi">3</span></code></pre>
  </section>
</div>
<div class="detail" id="--/2">
    <div class="detail-header">
    <a href="#--/2" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">left -- right</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L1247" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre><a href="typespecs.html#built-in-types">list</a>() -- <a href="typespecs.html#built-in-types">list</a>() :: <a href="typespecs.html#built-in-types">list</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Removes the first occurrence of an item on the left list
for each item on the right.</p>
<p>The complexity of <code class="inline">a -- b</code> is proportional to <code class="inline">length(a) * length(b)</code>,
meaning that it will be very slow if both <code class="inline">a</code> and <code class="inline">b</code> are long lists.
In such cases, consider converting each list to a <a href="MapSet.html"><code class="inline">MapSet</code></a> and using
<a href="MapSet.html#difference/2"><code class="inline">MapSet.difference/2</code></a>.</p>
<p>Inlined by the compiler.</p>
<h2 id="--/2-examples" class="section-heading">
  <a href="#--/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="p" data-group-id="5793994416-1">[</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p" data-group-id="5793994416-1">]</span><span class="w"> </span><span class="o">--</span><span class="w"> </span><span class="p" data-group-id="5793994416-2">[</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p" data-group-id="5793994416-2">]</span><span class="w">
</span><span class="p" data-group-id="5793994416-3">[</span><span class="mi">3</span><span class="p" data-group-id="5793994416-3">]</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="p" data-group-id="5793994416-4">[</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p" data-group-id="5793994416-4">]</span><span class="w"> </span><span class="o">--</span><span class="w"> </span><span class="p" data-group-id="5793994416-5">[</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p" data-group-id="5793994416-5">]</span><span class="w">
</span><span class="p" data-group-id="5793994416-6">[</span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p" data-group-id="5793994416-6">]</span></code></pre>
  </section>
</div>
<div class="detail" id="-/1">
    <div class="detail-header">
    <a href="#-/1" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">-value</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L1135" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>-0 :: 0</pre>
          <pre>-<a href="typespecs.html#basic-types">pos_integer</a>() :: <a href="typespecs.html#basic-types">neg_integer</a>()</pre>
          <pre>-<a href="typespecs.html#basic-types">neg_integer</a>() :: <a href="typespecs.html#basic-types">pos_integer</a>()</pre>
          <pre>-<a href="typespecs.html#basic-types">float</a>() :: <a href="typespecs.html#basic-types">float</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Arithmetic unary minus.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
<h2 id="-/1-examples" class="section-heading">
  <a href="#-/1-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="o">-</span><span class="mi">2</span><span class="w">
</span><span class="o">-</span><span class="mi">2</span></code></pre>
  </section>
</div>
<div class="detail" id="-/2">
    <div class="detail-header">
    <a href="#-/2" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">left - right</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L1100" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre><a href="typespecs.html#basic-types">integer</a>() - <a href="typespecs.html#basic-types">integer</a>() :: <a href="typespecs.html#basic-types">integer</a>()</pre>
          <pre><a href="typespecs.html#basic-types">float</a>() - <a href="typespecs.html#basic-types">float</a>() :: <a href="typespecs.html#basic-types">float</a>()</pre>
          <pre><a href="typespecs.html#basic-types">integer</a>() - <a href="typespecs.html#basic-types">float</a>() :: <a href="typespecs.html#basic-types">float</a>()</pre>
          <pre><a href="typespecs.html#basic-types">float</a>() - <a href="typespecs.html#basic-types">integer</a>() :: <a href="typespecs.html#basic-types">float</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Arithmetic subtraction.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
<h2 id="-/2-examples" class="section-heading">
  <a href="#-/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="mi">1</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">2</span><span class="w">
</span><span class="o">-</span><span class="mi">1</span></code></pre>
  </section>
</div>
<div class="detail" id="../2">
    <div class="detail-header">
    <a href="#../2" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">first..last</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L3042" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Returns a range with the specified <code class="inline">first</code> and <code class="inline">last</code> integers.</p>
<p>If last is larger than first, the range will be increasing from
first to last. If first is larger than last, the range will be
decreasing from first to last. If first is equal to last, the range
will contain one element, which is the number itself.</p>
<h2 id="../2-examples" class="section-heading">
  <a href="#../2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="mi">0</span><span class="w"> </span><span class="ow">in</span><span class="w"> </span><span class="mi">1</span><span class="o">.</span><span class="o">.</span><span class="mi">3</span><span class="w">
</span><span class="no">false</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="mi">1</span><span class="w"> </span><span class="ow">in</span><span class="w"> </span><span class="mi">1</span><span class="o">.</span><span class="o">.</span><span class="mi">3</span><span class="w">
</span><span class="no">true</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="mi">2</span><span class="w"> </span><span class="ow">in</span><span class="w"> </span><span class="mi">1</span><span class="o">.</span><span class="o">.</span><span class="mi">3</span><span class="w">
</span><span class="no">true</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="mi">3</span><span class="w"> </span><span class="ow">in</span><span class="w"> </span><span class="mi">1</span><span class="o">.</span><span class="o">.</span><span class="mi">3</span><span class="w">
</span><span class="no">true</span></code></pre>
  </section>
</div>
<div class="detail" id="//2">
    <div class="detail-header">
    <a href="#//2" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">left / right</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L1184" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre><a href="typespecs.html#built-in-types">number</a>() / <a href="typespecs.html#built-in-types">number</a>() :: <a href="typespecs.html#basic-types">float</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Arithmetic division.</p>
<p>The result is always a float. Use <a href="#div/2"><code class="inline">div/2</code></a> and <a href="#rem/2"><code class="inline">rem/2</code></a> if you want
an integer division or the remainder.</p>
<p>Raises <a href="ArithmeticError.html"><code class="inline">ArithmeticError</code></a> if <code class="inline">right</code> is 0 or 0.0.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
<h2 id="//2-examples" class="section-heading">
  <a href="#//2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="mi">1</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="mi">2</span><span class="w">
</span><span class="c1">#=&gt; 0.5</span><span class="w">

</span><span class="o">-</span><span class="mf">3.0</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="mf">2.0</span><span class="w">
</span><span class="c1">#=&gt; -1.5</span><span class="w">

</span><span class="mi">5</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="mi">1</span><span class="w">
</span><span class="c1">#=&gt; 5.0</span><span class="w">

</span><span class="mi">7</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="mi">0</span><span class="w">
</span><span class="c1">#=&gt; ** (ArithmeticError) bad argument in arithmetic expression</span></code></pre>
  </section>
</div>
<div class="detail" id="%3C/2">
    <span id="&lt;/2"></span>
    <div class="detail-header">
    <a href="#%3C/2" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">left &lt; right</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L1284" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre><a href="typespecs.html#built-in-types">term</a>() < <a href="typespecs.html#built-in-types">term</a>() :: <a href="typespecs.html#built-in-types">boolean</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Returns <code class="inline">true</code> if left is less than right.</p>
<p>All terms in Elixir can be compared with each other.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
<h2 id="%3C/2-examples" class="section-heading">
  <a href="#%3C/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="mi">1</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="mi">2</span><span class="w">
</span><span class="no">true</span></code></pre>
  </section>
</div>
<div class="detail" id="%3C=/2">
    <span id="&lt;=/2"></span>
    <div class="detail-header">
    <a href="#%3C=/2" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">left &lt;= right</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L1320" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre><a href="typespecs.html#built-in-types">term</a>() <= <a href="typespecs.html#built-in-types">term</a>() :: <a href="typespecs.html#built-in-types">boolean</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Returns <code class="inline">true</code> if left is less than or equal to right.</p>
<p>All terms in Elixir can be compared with each other.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
<h2 id="%3C=/2-examples" class="section-heading">
  <a href="#%3C=/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="mi">1</span><span class="w"> </span><span class="o">&lt;=</span><span class="w"> </span><span class="mi">2</span><span class="w">
</span><span class="no">true</span></code></pre>
  </section>
</div>
<div class="detail" id="%3C%3E/2">
    <span id="&lt;&gt;/2"></span>
    <div class="detail-header">
    <a href="#%3C%3E/2" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">left &lt;&gt; right</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L1613" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Concatenates two binaries.</p>
<h2 id="%3C%3E/2-examples" class="section-heading">
  <a href="#%3C%3E/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="s">&quot;foo&quot;</span><span class="w"> </span><span class="o">&lt;&gt;</span><span class="w"> </span><span class="s">&quot;bar&quot;</span><span class="w">
</span><span class="s">&quot;foobar&quot;</span></code></pre>
<p>The <a href="#%253C%253E/2"><code class="inline">&lt;&gt;/2</code></a> operator can also be used in pattern matching (and guard clauses) as
long as the left argument is a literal binary:</p>
<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="s">&quot;foo&quot;</span><span class="w"> </span><span class="o">&lt;&gt;</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;foobar&quot;</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="n">x</span><span class="w">
</span><span class="s">&quot;bar&quot;</span></code></pre>
<p><code class="inline">x &lt;&gt; &quot;bar&quot; = &quot;foobar&quot;</code> would have resulted in a <a href="CompileError.html"><code class="inline">CompileError</code></a> exception.</p>
  </section>
</div>
<div class="detail" id="==/2">
    <div class="detail-header">
    <a href="#==/2" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">left == right</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L1362" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre><a href="typespecs.html#built-in-types">term</a>() == <a href="typespecs.html#built-in-types">term</a>() :: <a href="typespecs.html#built-in-types">boolean</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Returns <code class="inline">true</code> if the two items are equal.</p>
<p>This operator considers 1 and 1.0 to be equal. For stricter
semantics, use <a href="#===/2"><code class="inline">===/2</code></a> instead.</p>
<p>All terms in Elixir can be compared with each other.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
<h2 id="==/2-examples" class="section-heading">
  <a href="#==/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="mi">1</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">2</span><span class="w">
</span><span class="no">false</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="mi">1</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mf">1.0</span><span class="w">
</span><span class="no">true</span></code></pre>
  </section>
</div>
<div class="detail" id="===/2">
    <div class="detail-header">
    <a href="#===/2" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">left === right</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L1412" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre><a href="typespecs.html#built-in-types">term</a>() === <a href="typespecs.html#built-in-types">term</a>() :: <a href="typespecs.html#built-in-types">boolean</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Returns <code class="inline">true</code> if the two items are exactly equal.</p>
<p>The items are only considered to be exactly equal if they
have the same value and are of the same type. For example,
<code class="inline">1 == 1.0</code> returns <code class="inline">true</code>, but since they are of different
types, <code class="inline">1 === 1.0</code> returns <code class="inline">false</code>.</p>
<p>All terms in Elixir can be compared with each other.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
<h2 id="===/2-examples" class="section-heading">
  <a href="#===/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="mi">1</span><span class="w"> </span><span class="o">===</span><span class="w"> </span><span class="mi">2</span><span class="w">
</span><span class="no">false</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="mi">1</span><span class="w"> </span><span class="o">===</span><span class="w"> </span><span class="mf">1.0</span><span class="w">
</span><span class="no">false</span></code></pre>
  </section>
</div>
<div class="detail" id="=~/2">
    <div class="detail-header">
    <a href="#=~/2" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">left =~ right</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L1864" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre><a href="String.html#t:t/0">String.t</a>() =~ (<a href="String.html#t:t/0">String.t</a>() | <a href="Regex.html#t:t/0">Regex.t</a>()) :: <a href="typespecs.html#built-in-types">boolean</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Matches the term on the left against the regular expression or string on the
right.</p>
<p>Returns <code class="inline">true</code> if <code class="inline">left</code> matches <code class="inline">right</code> (if it’s a regular expression)
or contains <code class="inline">right</code> (if it’s a string).</p>
<h2 id="=~/2-examples" class="section-heading">
  <a href="#=~/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="s">&quot;abcd&quot;</span><span class="w"> </span><span class="o">=~</span><span class="w"> </span><span class="sr">~r/c(d)/</span><span class="w">
</span><span class="no">true</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="s">&quot;abcd&quot;</span><span class="w"> </span><span class="o">=~</span><span class="w"> </span><span class="sr">~r/e/</span><span class="w">
</span><span class="no">false</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="s">&quot;abcd&quot;</span><span class="w"> </span><span class="o">=~</span><span class="w"> </span><span class="s">&quot;bc&quot;</span><span class="w">
</span><span class="no">true</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="s">&quot;abcd&quot;</span><span class="w"> </span><span class="o">=~</span><span class="w"> </span><span class="s">&quot;ad&quot;</span><span class="w">
</span><span class="no">false</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="s">&quot;abcd&quot;</span><span class="w"> </span><span class="o">=~</span><span class="w"> </span><span class="s">&quot;&quot;</span><span class="w">
</span><span class="no">true</span></code></pre>
  </section>
</div>
<div class="detail" id="%3E/2">
    <span id="&gt;/2"></span>
    <div class="detail-header">
    <a href="#%3E/2" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">left &gt; right</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L1302" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre><a href="typespecs.html#built-in-types">term</a>() > <a href="typespecs.html#built-in-types">term</a>() :: <a href="typespecs.html#built-in-types">boolean</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Returns <code class="inline">true</code> if left is more than right.</p>
<p>All terms in Elixir can be compared with each other.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
<h2 id="%3E/2-examples" class="section-heading">
  <a href="#%3E/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="mi">1</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="mi">2</span><span class="w">
</span><span class="no">false</span></code></pre>
  </section>
</div>
<div class="detail" id="%3E=/2">
    <span id="&gt;=/2"></span>
    <div class="detail-header">
    <a href="#%3E=/2" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">left &gt;= right</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L1338" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre><a href="typespecs.html#built-in-types">term</a>() >= <a href="typespecs.html#built-in-types">term</a>() :: <a href="typespecs.html#built-in-types">boolean</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Returns <code class="inline">true</code> if left is more than or equal to right.</p>
<p>All terms in Elixir can be compared with each other.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
<h2 id="%3E=/2-examples" class="section-heading">
  <a href="#%3E=/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="mi">1</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="mi">2</span><span class="w">
</span><span class="no">false</span></code></pre>
  </section>
</div>
<div class="detail" id="@/1">
    <div class="detail-header">
    <a href="#@/1" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">@expr</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L2695" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Reads and writes attributes of the current module.</p>
<p>The canonical example for attributes is annotating that a module
implements an OTP behaviour, such as <a href="GenServer.html"><code class="inline">GenServer</code></a>:</p>
<pre><code class="nohighlight makeup elixir"><span class="kd">defmodule</span><span class="w"> </span><span class="nc">MyServer</span><span class="w"> </span><span class="k" data-group-id="8830811131-1">do</span><span class="w">
  </span><span class="na">@behaviour</span><span class="w"> </span><span class="nc">GenServer</span><span class="w">
  </span><span class="c1"># ... callbacks ...</span><span class="w">
</span><span class="k" data-group-id="8830811131-1">end</span></code></pre>
<p>By default Elixir supports all the module attributes supported by Erlang, but
custom attributes can be used as well:</p>
<pre><code class="nohighlight makeup elixir"><span class="kd">defmodule</span><span class="w"> </span><span class="nc">MyServer</span><span class="w"> </span><span class="k" data-group-id="1526721977-1">do</span><span class="w">
  </span><span class="na">@my_data</span><span class="w"> </span><span class="mi">13</span><span class="w">
  </span><span class="nc">IO</span><span class="o">.</span><span class="n">inspect</span><span class="w"> </span><span class="na">@my_data</span><span class="w"> </span><span class="c1">#=&gt; 13</span><span class="w">
</span><span class="k" data-group-id="1526721977-1">end</span></code></pre>
<p>Unlike Erlang, such attributes are not stored in the module by default since
it is common in Elixir to use custom attributes to store temporary data that
will be available at compile-time. Custom attributes may be configured to
behave closer to Erlang by using <a href="Module.html#register_attribute/3"><code class="inline">Module.register_attribute/3</code></a>.</p>
<p>Finally, notice that attributes can also be read inside functions:</p>
<pre><code class="nohighlight makeup elixir"><span class="kd">defmodule</span><span class="w"> </span><span class="nc">MyServer</span><span class="w"> </span><span class="k" data-group-id="4725637283-1">do</span><span class="w">
  </span><span class="na">@my_data</span><span class="w"> </span><span class="mi">11</span><span class="w">
  </span><span class="kd">def</span><span class="w"> </span><span class="nf">first_data</span><span class="p">,</span><span class="w"> </span><span class="ss">do</span><span class="p">:</span><span class="w"> </span><span class="na">@my_data</span><span class="w">
  </span><span class="na">@my_data</span><span class="w"> </span><span class="mi">13</span><span class="w">
  </span><span class="kd">def</span><span class="w"> </span><span class="nf">second_data</span><span class="p">,</span><span class="w"> </span><span class="ss">do</span><span class="p">:</span><span class="w"> </span><span class="na">@my_data</span><span class="w">
</span><span class="k" data-group-id="4725637283-1">end</span><span class="w">

</span><span class="nc">MyServer</span><span class="o">.</span><span class="n">first_data</span><span class="w"> </span><span class="c1">#=&gt; 11</span><span class="w">
</span><span class="nc">MyServer</span><span class="o">.</span><span class="n">second_data</span><span class="w"> </span><span class="c1">#=&gt; 13</span></code></pre>
<p>It is important to note that reading an attribute takes a snapshot of
its current value. In other words, the value is read at compilation
time and not at runtime. Check the <a href="Module.html"><code class="inline">Module</code></a> module for other functions
to manipulate module attributes.</p>
  </section>
</div>
<div class="detail" id="abs/1">
    <div class="detail-header">
    <a href="#abs/1" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">abs(number)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L195" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>abs(<a href="typespecs.html#built-in-types">number</a>()) :: <a href="typespecs.html#built-in-types">number</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Returns an integer or float which is the arithmetical absolute value of <code class="inline">number</code>.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
<h2 id="abs/1-examples" class="section-heading">
  <a href="#abs/1-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">abs</span><span class="p" data-group-id="1402532026-1">(</span><span class="o">-</span><span class="mf">3.33</span><span class="p" data-group-id="1402532026-1">)</span><span class="w">
</span><span class="mf">3.33</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="n">abs</span><span class="p" data-group-id="1402532026-2">(</span><span class="o">-</span><span class="mi">3</span><span class="p" data-group-id="1402532026-2">)</span><span class="w">
</span><span class="mi">3</span></code></pre>
  </section>
</div>
<div class="detail" id="alias!/1">
    <div class="detail-header">
    <a href="#alias!/1" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">alias!(alias)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L3576" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>When used inside quoting, marks that the given alias should not
be hygienized. This means the alias will be expanded when
the macro is expanded.</p>
<p>Check <a href="Kernel.SpecialForms.html#quote/2"><code class="inline">Kernel.SpecialForms.quote/2</code></a> for more information.</p>
  </section>
</div>
<div class="detail" id="and/2">
    <div class="detail-header">
    <a href="#and/2" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">left and right</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L1530" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Boolean and.</p>
<p>If <code class="inline">left</code> is <code class="inline">false</code>, returns <code class="inline">false</code>; otherwise returns <code class="inline">right</code>.</p>
<p>Requires only the <code class="inline">left</code> operand to be a boolean since it short-circuits. If
the <code class="inline">left</code> operand is not a boolean, an <a href="ArgumentError.html"><code class="inline">ArgumentError</code></a> exception is raised.</p>
<p>Allowed in guard tests.</p>
<h2 id="and/2-examples" class="section-heading">
  <a href="#and/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="no">true</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="no">false</span><span class="w">
</span><span class="no">false</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="no">true</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="s">&quot;yay!&quot;</span><span class="w">
</span><span class="s">&quot;yay!&quot;</span></code></pre>
  </section>
</div>
<div class="detail" id="apply/2">
    <div class="detail-header">
    <a href="#apply/2" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">apply(fun, args)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L212" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>apply((... -> <a href="typespecs.html#basic-types">any</a>()), [<a href="typespecs.html#basic-types">any</a>()]) :: <a href="typespecs.html#basic-types">any</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Invokes the given anonymous function <code class="inline">fun</code> with the list of
arguments <code class="inline">args</code>.</p>
<p>Inlined by the compiler.</p>
<h2 id="apply/2-examples" class="section-heading">
  <a href="#apply/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">apply</span><span class="p" data-group-id="0533670316-1">(</span><span class="k" data-group-id="0533670316-2">fn</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="k" data-group-id="0533670316-2">end</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="0533670316-3">[</span><span class="mi">2</span><span class="p" data-group-id="0533670316-3">]</span><span class="p" data-group-id="0533670316-1">)</span><span class="w">
</span><span class="mi">4</span></code></pre>
  </section>
</div>
<div class="detail" id="apply/3">
    <div class="detail-header">
    <a href="#apply/3" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">apply(module, function_name, args)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L233" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>apply(<a href="typespecs.html#built-in-types">module</a>(), function_name :: <a href="typespecs.html#basic-types">atom</a>(), [<a href="typespecs.html#basic-types">any</a>()]) :: <a href="typespecs.html#basic-types">any</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Invokes the given function from <code class="inline">module</code> with the list of
arguments <code class="inline">args</code>.</p>
<p><a href="#apply/3"><code class="inline">apply/3</code></a> is used to invoke functions where the module, function
name or arguments are defined dynamically at runtime. For this
reason, you can’t invoke macros using <a href="#apply/3"><code class="inline">apply/3</code></a>, only functions.</p>
<p>Inlined by the compiler.</p>
<h2 id="apply/3-examples" class="section-heading">
  <a href="#apply/3-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">apply</span><span class="p" data-group-id="9930588189-1">(</span><span class="nc">Enum</span><span class="p">,</span><span class="w"> </span><span class="ss">:reverse</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="9930588189-2">[</span><span class="p" data-group-id="9930588189-3">[</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p" data-group-id="9930588189-3">]</span><span class="p" data-group-id="9930588189-2">]</span><span class="p" data-group-id="9930588189-1">)</span><span class="w">
</span><span class="p" data-group-id="9930588189-4">[</span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p" data-group-id="9930588189-4">]</span></code></pre>
  </section>
</div>
<div class="detail" id="binary_part/3">
    <div class="detail-header">
    <a href="#binary_part/3" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">binary_part(binary, start, length)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L259" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>binary_part(<a href="typespecs.html#built-in-types">binary</a>(), <a href="typespecs.html#basic-types">non_neg_integer</a>(), <a href="typespecs.html#basic-types">integer</a>()) :: <a href="typespecs.html#built-in-types">binary</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Extracts the part of the binary starting at <code class="inline">start</code> with length <code class="inline">length</code>.
Binaries are zero-indexed.</p>
<p>If <code class="inline">start</code> or <code class="inline">length</code> reference in any way outside the binary, an
<a href="ArgumentError.html"><code class="inline">ArgumentError</code></a> exception is raised.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
<h2 id="binary_part/3-examples" class="section-heading">
  <a href="#binary_part/3-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">binary_part</span><span class="p" data-group-id="8911849114-1">(</span><span class="s">&quot;foo&quot;</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p" data-group-id="8911849114-1">)</span><span class="w">
</span><span class="s">&quot;oo&quot;</span></code></pre>
<p>A negative <code class="inline">length</code> can be used to extract bytes that come <em>before</em> the byte
at <code class="inline">start</code>:</p>
<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">binary_part</span><span class="p" data-group-id="5246509169-1">(</span><span class="s">&quot;Hello&quot;</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="p">,</span><span class="w"> </span><span class="o">-</span><span class="mi">3</span><span class="p" data-group-id="5246509169-1">)</span><span class="w">
</span><span class="s">&quot;llo&quot;</span></code></pre>
  </section>
</div>
<div class="detail" id="binding/1">
  
    <span id="binding/0"></span>
  <div class="detail-header">
    <a href="#binding/1" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">binding(context \\ nil)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L2843" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Returns the binding for the given context as a keyword list.</p>
<p>In the returned result, keys are variable names and values are the
corresponding variable values.</p>
<p>If the given <code class="inline">context</code> is <code class="inline">nil</code> (by default it is), the binding for the
current context is returned.</p>
<h2 id="binding/1-examples" class="section-heading">
  <a href="#binding/1-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="n">binding</span><span class="p" data-group-id="5697723028-1">(</span><span class="p" data-group-id="5697723028-1">)</span><span class="w">
</span><span class="p" data-group-id="5697723028-2">[</span><span class="ss">x</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p" data-group-id="5697723028-2">]</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">2</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="n">binding</span><span class="p" data-group-id="5697723028-3">(</span><span class="p" data-group-id="5697723028-3">)</span><span class="w">
</span><span class="p" data-group-id="5697723028-4">[</span><span class="ss">x</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p" data-group-id="5697723028-4">]</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="n">binding</span><span class="p" data-group-id="5697723028-5">(</span><span class="ss">:foo</span><span class="p" data-group-id="5697723028-5">)</span><span class="w">
</span><span class="p" data-group-id="5697723028-6">[</span><span class="p" data-group-id="5697723028-6">]</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="n">var!</span><span class="p" data-group-id="5697723028-7">(</span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="ss">:foo</span><span class="p" data-group-id="5697723028-7">)</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1</span><span class="w">
</span><span class="mi">1</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="n">binding</span><span class="p" data-group-id="5697723028-8">(</span><span class="ss">:foo</span><span class="p" data-group-id="5697723028-8">)</span><span class="w">
</span><span class="p" data-group-id="5697723028-9">[</span><span class="ss">x</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p" data-group-id="5697723028-9">]</span></code></pre>
  </section>
</div>
<div class="detail" id="bit_size/1">
    <div class="detail-header">
    <a href="#bit_size/1" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">bit_size(bitstring)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L278" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>bit_size(<a href="typespecs.html#built-in-types">bitstring</a>()) :: <a href="typespecs.html#basic-types">non_neg_integer</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Returns an integer which is the size in bits of <code class="inline">bitstring</code>.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
<h2 id="bit_size/1-examples" class="section-heading">
  <a href="#bit_size/1-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">bit_size</span><span class="p" data-group-id="8442504284-1">(</span><span class="p" data-group-id="8442504284-2">&lt;&lt;</span><span class="mi">433</span><span class="o">::</span><span class="mi">16</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="o">::</span><span class="mi">3</span><span class="p" data-group-id="8442504284-2">&gt;&gt;</span><span class="p" data-group-id="8442504284-1">)</span><span class="w">
</span><span class="mi">19</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="n">bit_size</span><span class="p" data-group-id="8442504284-3">(</span><span class="p" data-group-id="8442504284-4">&lt;&lt;</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p" data-group-id="8442504284-4">&gt;&gt;</span><span class="p" data-group-id="8442504284-3">)</span><span class="w">
</span><span class="mi">24</span></code></pre>
  </section>
</div>
<div class="detail" id="byte_size/1">
    <div class="detail-header">
    <a href="#byte_size/1" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">byte_size(bitstring)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L301" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>byte_size(<a href="typespecs.html#built-in-types">bitstring</a>()) :: <a href="typespecs.html#basic-types">non_neg_integer</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Returns the number of bytes needed to contain <code class="inline">bitstring</code>.</p>
<p>That is, if the number of bits in <code class="inline">bitstring</code> is not divisible by 8, the
resulting number of bytes will be rounded up (by excess). This operation
happens in constant time.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
<h2 id="byte_size/1-examples" class="section-heading">
  <a href="#byte_size/1-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">byte_size</span><span class="p" data-group-id="5794060813-1">(</span><span class="p" data-group-id="5794060813-2">&lt;&lt;</span><span class="mi">433</span><span class="o">::</span><span class="mi">16</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="o">::</span><span class="mi">3</span><span class="p" data-group-id="5794060813-2">&gt;&gt;</span><span class="p" data-group-id="5794060813-1">)</span><span class="w">
</span><span class="mi">3</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="n">byte_size</span><span class="p" data-group-id="5794060813-3">(</span><span class="p" data-group-id="5794060813-4">&lt;&lt;</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p" data-group-id="5794060813-4">&gt;&gt;</span><span class="p" data-group-id="5794060813-3">)</span><span class="w">
</span><span class="mi">3</span></code></pre>
  </section>
</div>
<div class="detail" id="def/2">
  
    <span id="def/1"></span>
  <div class="detail-header">
    <a href="#def/2" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">def(call, expr \\ nil)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L3901" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Defines a function with the given name and body.</p>
<h2 id="def/2-examples" class="section-heading">
  <a href="#def/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="kd">defmodule</span><span class="w"> </span><span class="nc">Foo</span><span class="w"> </span><span class="k" data-group-id="3319397462-1">do</span><span class="w">
  </span><span class="kd">def</span><span class="w"> </span><span class="nf">bar</span><span class="p">,</span><span class="w"> </span><span class="ss">do</span><span class="p">:</span><span class="w"> </span><span class="ss">:baz</span><span class="w">
</span><span class="k" data-group-id="3319397462-1">end</span><span class="w">

</span><span class="nc">Foo</span><span class="o">.</span><span class="n">bar</span><span class="p" data-group-id="3319397462-2">(</span><span class="p" data-group-id="3319397462-2">)</span><span class="w"> </span><span class="c1">#=&gt; :baz</span></code></pre>
<p>A function that expects arguments can be defined as follows:</p>
<pre><code class="nohighlight makeup elixir"><span class="kd">defmodule</span><span class="w"> </span><span class="nc">Foo</span><span class="w"> </span><span class="k" data-group-id="0383680636-1">do</span><span class="w">
  </span><span class="kd">def</span><span class="w"> </span><span class="nf">sum</span><span class="p" data-group-id="0383680636-2">(</span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="p" data-group-id="0383680636-2">)</span><span class="w"> </span><span class="k" data-group-id="0383680636-3">do</span><span class="w">
    </span><span class="n">a</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">b</span><span class="w">
  </span><span class="k" data-group-id="0383680636-3">end</span><span class="w">
</span><span class="k" data-group-id="0383680636-1">end</span></code></pre>
<p>In the example above, a <code class="inline">sum/2</code> function is defined; this function receives
two arguments and returns their sum.</p>
<h2 id="def/2-default-arguments" class="section-heading">
  <a href="#def/2-default-arguments" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Default arguments
</h2>

<p><code class="inline">\\</code> is used to specify a default value for a parameter of a function. For
example:</p>
<pre><code class="nohighlight makeup elixir"><span class="kd">defmodule</span><span class="w"> </span><span class="nc">MyMath</span><span class="w"> </span><span class="k" data-group-id="8869647363-1">do</span><span class="w">
  </span><span class="kd">def</span><span class="w"> </span><span class="nf">multiply_by</span><span class="p" data-group-id="8869647363-2">(</span><span class="n">number</span><span class="p">,</span><span class="w"> </span><span class="n">factor</span><span class="w"> </span><span class="o">\\</span><span class="w"> </span><span class="mi">2</span><span class="p" data-group-id="8869647363-2">)</span><span class="w"> </span><span class="k" data-group-id="8869647363-3">do</span><span class="w">
    </span><span class="n">number</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">factor</span><span class="w">
  </span><span class="k" data-group-id="8869647363-3">end</span><span class="w">
</span><span class="k" data-group-id="8869647363-1">end</span><span class="w">

</span><span class="nc">MyMath</span><span class="o">.</span><span class="n">multiply_by</span><span class="p" data-group-id="8869647363-4">(</span><span class="mi">4</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p" data-group-id="8869647363-4">)</span><span class="w"> </span><span class="c1">#=&gt; 12</span><span class="w">
</span><span class="nc">MyMath</span><span class="o">.</span><span class="n">multiply_by</span><span class="p" data-group-id="8869647363-5">(</span><span class="mi">4</span><span class="p" data-group-id="8869647363-5">)</span><span class="w"> </span><span class="c1">#=&gt; 8</span></code></pre>
<p>The compiler translates this into multiple functions with different arities,
here <code class="inline">Foo.multiply_by/1</code> and <code class="inline">Foo.multiply_by/2</code>, that represent cases when
arguments for parameters with default values are passed or not passed.</p>
<p>When defining a function with default arguments as well as multiple
explicitly declared clauses, you must write a function head that declares the
defaults. For example:</p>
<pre><code class="nohighlight makeup elixir"><span class="kd">defmodule</span><span class="w"> </span><span class="nc">MyString</span><span class="w"> </span><span class="k" data-group-id="6724404099-1">do</span><span class="w">
  </span><span class="kd">def</span><span class="w"> </span><span class="nf">join</span><span class="p" data-group-id="6724404099-2">(</span><span class="n">string1</span><span class="p">,</span><span class="w"> </span><span class="n">string2</span><span class="w"> </span><span class="o">\\</span><span class="w"> </span><span class="no">nil</span><span class="p">,</span><span class="w"> </span><span class="n">separator</span><span class="w"> </span><span class="o">\\</span><span class="w"> </span><span class="s">&quot; &quot;</span><span class="p" data-group-id="6724404099-2">)</span><span class="w">

  </span><span class="kd">def</span><span class="w"> </span><span class="nf">join</span><span class="p" data-group-id="6724404099-3">(</span><span class="n">string1</span><span class="p">,</span><span class="w"> </span><span class="no">nil</span><span class="p">,</span><span class="w"> </span><span class="c">_separator</span><span class="p" data-group-id="6724404099-3">)</span><span class="w"> </span><span class="k" data-group-id="6724404099-4">do</span><span class="w">
    </span><span class="n">string1</span><span class="w">
  </span><span class="k" data-group-id="6724404099-4">end</span><span class="w">

  </span><span class="kd">def</span><span class="w"> </span><span class="nf">join</span><span class="p" data-group-id="6724404099-5">(</span><span class="n">string1</span><span class="p">,</span><span class="w"> </span><span class="n">string2</span><span class="p">,</span><span class="w"> </span><span class="n">separator</span><span class="p" data-group-id="6724404099-5">)</span><span class="w"> </span><span class="k" data-group-id="6724404099-6">do</span><span class="w">
    </span><span class="n">string1</span><span class="w"> </span><span class="o">&lt;&gt;</span><span class="w"> </span><span class="n">separator</span><span class="w"> </span><span class="o">&lt;&gt;</span><span class="w"> </span><span class="n">string2</span><span class="w">
  </span><span class="k" data-group-id="6724404099-6">end</span><span class="w">
</span><span class="k" data-group-id="6724404099-1">end</span></code></pre>
<p>Note that <code class="inline">\\</code> can’t be used with anonymous functions because they
can only have a sole arity.</p>
<h2 id="def/2-function-and-variable-names" class="section-heading">
  <a href="#def/2-function-and-variable-names" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Function and variable names
</h2>

<p>Function and variable names have the following syntax:
A <em>lowercase ASCII letter</em> or an <em>underscore</em>, followed by any number of
<em>lowercase or uppercase ASCII letters</em>, <em>numbers</em>, or <em>underscores</em>.
Optionally they can end in either an <em>exclamation mark</em> or a <em>question mark</em>.</p>
<p>For variables, any identifier starting with an underscore should indicate an
unused variable. For example:</p>
<pre><code class="nohighlight makeup elixir"><span class="kd">def</span><span class="w"> </span><span class="nf">foo</span><span class="p" data-group-id="0262302951-1">(</span><span class="n">bar</span><span class="p" data-group-id="0262302951-1">)</span><span class="w"> </span><span class="k" data-group-id="0262302951-2">do</span><span class="w">
  </span><span class="p" data-group-id="0262302951-3">[</span><span class="p" data-group-id="0262302951-3">]</span><span class="w">
</span><span class="k" data-group-id="0262302951-2">end</span><span class="w">
</span><span class="c1">#=&gt; warning: variable bar is unused</span><span class="w">

</span><span class="kd">def</span><span class="w"> </span><span class="nf">foo</span><span class="p" data-group-id="0262302951-4">(</span><span class="c">_bar</span><span class="p" data-group-id="0262302951-4">)</span><span class="w"> </span><span class="k" data-group-id="0262302951-5">do</span><span class="w">
  </span><span class="p" data-group-id="0262302951-6">[</span><span class="p" data-group-id="0262302951-6">]</span><span class="w">
</span><span class="k" data-group-id="0262302951-5">end</span><span class="w">
</span><span class="c1">#=&gt; no warning</span><span class="w">

</span><span class="kd">def</span><span class="w"> </span><span class="nf">foo</span><span class="p" data-group-id="0262302951-7">(</span><span class="c">_bar</span><span class="p" data-group-id="0262302951-7">)</span><span class="w"> </span><span class="k" data-group-id="0262302951-8">do</span><span class="w">
  </span><span class="c">_bar</span><span class="w">
</span><span class="k" data-group-id="0262302951-8">end</span><span class="w">
</span><span class="c1">#=&gt; warning: the underscored variable &quot;_bar&quot; is used after being set</span></code></pre>
<h2 id="def/2-rescue-catch-after" class="section-heading">
  <a href="#def/2-rescue-catch-after" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  rescue/catch/after
</h2>

<p>Function bodies support <code class="inline">rescue</code>, <code class="inline">catch</code> and <code class="inline">after</code> as <a href="Kernel.SpecialForms.html#try/1"><code class="inline">Kernel.SpecialForms.try/1</code></a>
does. The following two functions are equivalent:</p>
<pre><code class="nohighlight makeup elixir"><span class="kd">def</span><span class="w"> </span><span class="nf">format</span><span class="p" data-group-id="5360162452-1">(</span><span class="n">value</span><span class="p" data-group-id="5360162452-1">)</span><span class="w"> </span><span class="k" data-group-id="5360162452-2">do</span><span class="w">
  </span><span class="k">try</span><span class="w"> </span><span class="k" data-group-id="5360162452-3">do</span><span class="w">
    </span><span class="n">format!</span><span class="p" data-group-id="5360162452-4">(</span><span class="n">value</span><span class="p" data-group-id="5360162452-4">)</span><span class="w">
  </span><span class="k" data-group-id="5360162452-3">catch</span><span class="w">
    </span><span class="ss">:exit</span><span class="p">,</span><span class="w"> </span><span class="n">reason</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="p" data-group-id="5360162452-5">{</span><span class="ss">:error</span><span class="p">,</span><span class="w"> </span><span class="n">reason</span><span class="p" data-group-id="5360162452-5">}</span><span class="w">
  </span><span class="k" data-group-id="5360162452-3">end</span><span class="w">
</span><span class="k" data-group-id="5360162452-2">end</span><span class="w">

</span><span class="kd">def</span><span class="w"> </span><span class="nf">format</span><span class="p" data-group-id="5360162452-6">(</span><span class="n">value</span><span class="p" data-group-id="5360162452-6">)</span><span class="w"> </span><span class="k" data-group-id="5360162452-7">do</span><span class="w">
  </span><span class="n">format!</span><span class="p" data-group-id="5360162452-8">(</span><span class="n">value</span><span class="p" data-group-id="5360162452-8">)</span><span class="w">
</span><span class="k" data-group-id="5360162452-7">catch</span><span class="w">
  </span><span class="ss">:exit</span><span class="p">,</span><span class="w"> </span><span class="n">reason</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="p" data-group-id="5360162452-9">{</span><span class="ss">:error</span><span class="p">,</span><span class="w"> </span><span class="n">reason</span><span class="p" data-group-id="5360162452-9">}</span><span class="w">
</span><span class="k" data-group-id="5360162452-7">end</span></code></pre>
  </section>
</div>
<div class="detail" id="defdelegate/2">
    <div class="detail-header">
    <a href="#defdelegate/2" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">defdelegate(funs, opts)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L4867" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Defines a function that delegates to another module.</p>
<p>Functions defined with <a href="#defdelegate/2"><code class="inline">defdelegate/2</code></a> are public and can be invoked from
outside the module they’re defined in (like if they were defined using
<a href="#def/2"><code class="inline">def/2</code></a>). When the desire is to delegate as private functions, <a href="Kernel.SpecialForms.html#import/2"><code class="inline">import/2</code></a> should
be used.</p>
<p>Delegation only works with functions; delegating macros is not supported.</p>
<p>Check <a href="#def/2"><code class="inline">def/2</code></a> for rules on naming and default arguments.</p>
<h2 id="defdelegate/2-options" class="section-heading">
  <a href="#defdelegate/2-options" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Options
</h2>

<ul>
<li><p><code class="inline">:to</code> - the module to dispatch to.</p>
</li>
<li><p><code class="inline">:as</code> - the function to call on the target given in <code class="inline">:to</code>.
This parameter is optional and defaults to the name being
delegated (<code class="inline">funs</code>).</p>
</li>
</ul>
<h2 id="defdelegate/2-examples" class="section-heading">
  <a href="#defdelegate/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="kd">defmodule</span><span class="w"> </span><span class="nc">MyList</span><span class="w"> </span><span class="k" data-group-id="2679300400-1">do</span><span class="w">
  </span><span class="kd">defdelegate</span><span class="w"> </span><span class="n">reverse</span><span class="p" data-group-id="2679300400-2">(</span><span class="n">list</span><span class="p" data-group-id="2679300400-2">)</span><span class="p">,</span><span class="w"> </span><span class="ss">to</span><span class="p">:</span><span class="w"> </span><span class="ss">:lists</span><span class="w">
  </span><span class="kd">defdelegate</span><span class="w"> </span><span class="n">other_reverse</span><span class="p" data-group-id="2679300400-3">(</span><span class="n">list</span><span class="p" data-group-id="2679300400-3">)</span><span class="p">,</span><span class="w"> </span><span class="ss">to</span><span class="p">:</span><span class="w"> </span><span class="ss">:lists</span><span class="p">,</span><span class="w"> </span><span class="ss">as</span><span class="p">:</span><span class="w"> </span><span class="ss">:reverse</span><span class="w">
</span><span class="k" data-group-id="2679300400-1">end</span><span class="w">

</span><span class="nc">MyList</span><span class="o">.</span><span class="n">reverse</span><span class="p" data-group-id="2679300400-4">(</span><span class="p" data-group-id="2679300400-5">[</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p" data-group-id="2679300400-5">]</span><span class="p" data-group-id="2679300400-4">)</span><span class="w">
</span><span class="c1">#=&gt; [3, 2, 1]</span><span class="w">

</span><span class="nc">MyList</span><span class="o">.</span><span class="n">other_reverse</span><span class="p" data-group-id="2679300400-6">(</span><span class="p" data-group-id="2679300400-7">[</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p" data-group-id="2679300400-7">]</span><span class="p" data-group-id="2679300400-6">)</span><span class="w">
</span><span class="c1">#=&gt; [3, 2, 1]</span></code></pre>
  </section>
</div>
<div class="detail" id="defexception/1">
    <div class="detail-header">
    <a href="#defexception/1" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">defexception(fields)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L4239" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Defines an exception.</p>
<p>Exceptions are structs backed by a module that implements
the <a href="Exception.html"><code class="inline">Exception</code></a> behaviour. The <a href="Exception.html"><code class="inline">Exception</code></a> behaviour requires
two functions to be implemented:</p>
<ul>
<li><p><code class="inline">exception/1</code> - receives the arguments given to <a href="#raise/2"><code class="inline">raise/2</code></a>
and returns the exception struct. The default implementation
accepts either a set of keyword arguments that is merged into
the struct or a string to be used as the exception’s message.</p>
</li>
<li><p><code class="inline">message/1</code> - receives the exception struct and must return its
message. Most commonly exceptions have a message field which
by default is accessed by this function. However, if an exception
does not have a message field, this function must be explicitly
implemented.</p>
</li>
</ul>
<p>Since exceptions are structs, the API supported by <a href="#defstruct/1"><code class="inline">defstruct/1</code></a>
is also available in <a href="#defexception/1"><code class="inline">defexception/1</code></a>.</p>
<h2 id="defexception/1-raising-exceptions" class="section-heading">
  <a href="#defexception/1-raising-exceptions" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Raising exceptions
</h2>

<p>The most common way to raise an exception is via <a href="#raise/2"><code class="inline">raise/2</code></a>:</p>
<pre><code class="nohighlight makeup elixir"><span class="kd">defmodule</span><span class="w"> </span><span class="nc">MyAppError</span><span class="w"> </span><span class="k" data-group-id="8178520680-1">do</span><span class="w">
  </span><span class="kd">defexception</span><span class="w"> </span><span class="p" data-group-id="8178520680-2">[</span><span class="ss">:message</span><span class="p" data-group-id="8178520680-2">]</span><span class="w">
</span><span class="k" data-group-id="8178520680-1">end</span><span class="w">

</span><span class="n">value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p" data-group-id="8178520680-3">[</span><span class="ss">:hello</span><span class="p" data-group-id="8178520680-3">]</span><span class="w">

</span><span class="k">raise</span><span class="w"> </span><span class="nc">MyAppError</span><span class="p">,</span><span class="w">
  </span><span class="ss">message</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;did not get what was expected, got: </span><span class="si" data-group-id="8178520680-4">#{</span><span class="n">inspect</span><span class="w"> </span><span class="n">value</span><span class="si" data-group-id="8178520680-4">}</span><span class="s">&quot;</span></code></pre>
<p>In many cases it is more convenient to pass the expected value to
<a href="#raise/2"><code class="inline">raise/2</code></a> and generate the message in the <a href="Exception.html#c:exception/1"><code class="inline">Exception.exception/1</code></a> callback:</p>
<pre><code class="nohighlight makeup elixir"><span class="kd">defmodule</span><span class="w"> </span><span class="nc">MyAppError</span><span class="w"> </span><span class="k" data-group-id="6055023674-1">do</span><span class="w">
  </span><span class="kd">defexception</span><span class="w"> </span><span class="p" data-group-id="6055023674-2">[</span><span class="ss">:message</span><span class="p" data-group-id="6055023674-2">]</span><span class="w">

  </span><span class="na">@impl</span><span class="w"> </span><span class="no">true</span><span class="w">
  </span><span class="kd">def</span><span class="w"> </span><span class="nf">exception</span><span class="p" data-group-id="6055023674-3">(</span><span class="n">value</span><span class="p" data-group-id="6055023674-3">)</span><span class="w"> </span><span class="k" data-group-id="6055023674-4">do</span><span class="w">
    </span><span class="n">msg</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;did not get what was expected, got: </span><span class="si" data-group-id="6055023674-5">#{</span><span class="n">inspect</span><span class="w"> </span><span class="n">value</span><span class="si" data-group-id="6055023674-5">}</span><span class="s">&quot;</span><span class="w">
    </span><span class="p" data-group-id="6055023674-6">%</span><span class="nc" data-group-id="6055023674-6">MyAppError</span><span class="p" data-group-id="6055023674-6">{</span><span class="ss">message</span><span class="p">:</span><span class="w"> </span><span class="n">msg</span><span class="p" data-group-id="6055023674-6">}</span><span class="w">
  </span><span class="k" data-group-id="6055023674-4">end</span><span class="w">
</span><span class="k" data-group-id="6055023674-1">end</span><span class="w">

</span><span class="k">raise</span><span class="w"> </span><span class="nc">MyAppError</span><span class="p">,</span><span class="w"> </span><span class="n">value</span></code></pre>
<p>The example above shows the preferred strategy for customizing
exception messages.</p>
  </section>
</div>
<div class="detail" id="defguard/1">
    <div class="detail-header">
    <a href="#defguard/1" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">defguard(guard)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L4635" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>

      <span class="note">(since 1.6.0)</span>
    
      <div class="specs">
          <pre>defguard(<a href="Macro.html#t:t/0">Macro.t</a>()) :: <a href="Macro.html#t:t/0">Macro.t</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Generates a macro suitable for use in guard expressions.</p>
<p>It raises at compile time if the definition uses expressions that aren’t
allowed in guards, and otherwise creates a macro that can be used both inside
or outside guards.</p>
<p>Note the convention in Elixir is to name functions/macros allowed in
guards with the <code class="inline">is_</code> prefix, such as <a href="#is_list/1"><code class="inline">is_list/1</code></a>. If, however, the
function/macro returns a boolean and is not allowed in guards, it should
have no prefix and end with a question mark, such as <a href="Keyword.html#keyword?/1"><code class="inline">Keyword.keyword?/1</code></a>.</p>
<h2 id="defguard/1-example" class="section-heading">
  <a href="#defguard/1-example" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Example
</h2>

<pre><code class="nohighlight makeup elixir"><span class="kd">defmodule</span><span class="w"> </span><span class="nc">Integer.Guards</span><span class="w"> </span><span class="k" data-group-id="4251977326-1">do</span><span class="w">
  </span><span class="kd">defguard</span><span class="w"> </span><span class="nf">is_even</span><span class="p" data-group-id="4251977326-2">(</span><span class="n">value</span><span class="p" data-group-id="4251977326-2">)</span><span class="w"> </span><span class="ow">when</span><span class="w"> </span><span class="n">is_integer</span><span class="p" data-group-id="4251977326-3">(</span><span class="n">value</span><span class="p" data-group-id="4251977326-3">)</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">rem</span><span class="p" data-group-id="4251977326-4">(</span><span class="n">value</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p" data-group-id="4251977326-4">)</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="w">
</span><span class="k" data-group-id="4251977326-1">end</span><span class="w">

</span><span class="kd">defmodule</span><span class="w"> </span><span class="nc">Collatz</span><span class="w"> </span><span class="k" data-group-id="4251977326-5">do</span><span class="w">
  </span><span class="na">@moduledoc</span><span class="w"> </span><span class="s">&quot;Tools for working with the Collatz sequence.&quot;</span><span class="w">
  </span><span class="kn">import</span><span class="w"> </span><span class="nc">Integer.Guards</span><span class="w">

  </span><span class="na">@doc</span><span class="w"> </span><span class="s">&quot;Determines the number of steps `n` takes to reach `1`.&quot;</span><span class="w">
  </span><span class="c1"># If this function never converges, please let me know what `n` you used.</span><span class="w">
  </span><span class="kd">def</span><span class="w"> </span><span class="nf">converge</span><span class="p" data-group-id="4251977326-6">(</span><span class="n">n</span><span class="p" data-group-id="4251977326-6">)</span><span class="w"> </span><span class="ow">when</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="ss">do</span><span class="p">:</span><span class="w"> </span><span class="n">step</span><span class="p" data-group-id="4251977326-7">(</span><span class="n">n</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p" data-group-id="4251977326-7">)</span><span class="w">

  </span><span class="kd">defp</span><span class="w"> </span><span class="nf">step</span><span class="p" data-group-id="4251977326-8">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="n">step_count</span><span class="p" data-group-id="4251977326-8">)</span><span class="w"> </span><span class="k" data-group-id="4251977326-9">do</span><span class="w">
    </span><span class="n">step_count</span><span class="w">
  </span><span class="k" data-group-id="4251977326-9">end</span><span class="w">

  </span><span class="kd">defp</span><span class="w"> </span><span class="nf">step</span><span class="p" data-group-id="4251977326-10">(</span><span class="n">n</span><span class="p">,</span><span class="w"> </span><span class="n">step_count</span><span class="p" data-group-id="4251977326-10">)</span><span class="w"> </span><span class="ow">when</span><span class="w"> </span><span class="n">is_even</span><span class="p" data-group-id="4251977326-11">(</span><span class="n">n</span><span class="p" data-group-id="4251977326-11">)</span><span class="w"> </span><span class="k" data-group-id="4251977326-12">do</span><span class="w">
    </span><span class="n">step</span><span class="p" data-group-id="4251977326-13">(</span><span class="n">div</span><span class="p" data-group-id="4251977326-14">(</span><span class="n">n</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p" data-group-id="4251977326-14">)</span><span class="p">,</span><span class="w"> </span><span class="n">step_count</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p" data-group-id="4251977326-13">)</span><span class="w">
  </span><span class="k" data-group-id="4251977326-12">end</span><span class="w">

  </span><span class="kd">defp</span><span class="w"> </span><span class="nf">step</span><span class="p" data-group-id="4251977326-15">(</span><span class="n">n</span><span class="p">,</span><span class="w"> </span><span class="n">step_count</span><span class="p" data-group-id="4251977326-15">)</span><span class="w"> </span><span class="k" data-group-id="4251977326-16">do</span><span class="w">
    </span><span class="n">step</span><span class="p" data-group-id="4251977326-17">(</span><span class="mi">3</span><span class="o">*</span><span class="n">n</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="n">step_count</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p" data-group-id="4251977326-17">)</span><span class="w">
  </span><span class="k" data-group-id="4251977326-16">end</span><span class="w">
</span><span class="k" data-group-id="4251977326-5">end</span></code></pre>
  </section>
</div>
<div class="detail" id="defguardp/1">
    <div class="detail-header">
    <a href="#defguardp/1" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">defguardp(guard)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L4651" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>

      <span class="note">(since 1.6.0)</span>
    
      <div class="specs">
          <pre>defguardp(<a href="Macro.html#t:t/0">Macro.t</a>()) :: <a href="Macro.html#t:t/0">Macro.t</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Generates a private macro suitable for use in guard expressions.</p>
<p>It raises at compile time if the definition uses expressions that aren’t
allowed in guards, and otherwise creates a private macro that can be used
both inside or outside guards in the current module.</p>
<p>Similar to <a href="#defmacrop/2"><code class="inline">defmacrop/2</code></a>, <a href="#defguardp/1"><code class="inline">defguardp/1</code></a> must be defined before its use
in the current module.</p>
  </section>
</div>
<div class="detail" id="defimpl/3">
  
    <span id="defimpl/2"></span>
  <div class="detail-header">
    <a href="#defimpl/3" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">defimpl(name, opts, do_block \\ [])</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L4517" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Defines an implementation for the given protocol.</p>
<p>See <a href="#defprotocol/2"><code class="inline">defprotocol/2</code></a> for more information and examples on protocols.</p>
<p>Inside an implementation, the name of the protocol can be accessed
via <code class="inline">@protocol</code> and the current target as <code class="inline">@for</code>.</p>
  </section>
</div>
<div class="detail" id="defmacro/2">
  
    <span id="defmacro/1"></span>
  <div class="detail-header">
    <a href="#defmacro/2" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">defmacro(call, expr \\ nil)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L3953" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Defines a macro with the given name and body.</p>
<p>Check <a href="#def/2"><code class="inline">def/2</code></a> for rules on naming and default arguments.</p>
<h2 id="defmacro/2-examples" class="section-heading">
  <a href="#defmacro/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="kd">defmodule</span><span class="w"> </span><span class="nc">MyLogic</span><span class="w"> </span><span class="k" data-group-id="5175480854-1">do</span><span class="w">
  </span><span class="kd">defmacro</span><span class="w"> </span><span class="nf">unless</span><span class="p" data-group-id="5175480854-2">(</span><span class="n">expr</span><span class="p">,</span><span class="w"> </span><span class="n">opts</span><span class="p" data-group-id="5175480854-2">)</span><span class="w"> </span><span class="k" data-group-id="5175480854-3">do</span><span class="w">
    </span><span class="k">quote</span><span class="w"> </span><span class="k" data-group-id="5175480854-4">do</span><span class="w">
      </span><span class="k">if</span><span class="w"> </span><span class="o">!</span><span class="k">unquote</span><span class="p" data-group-id="5175480854-5">(</span><span class="n">expr</span><span class="p" data-group-id="5175480854-5">)</span><span class="p">,</span><span class="w"> </span><span class="k">unquote</span><span class="p" data-group-id="5175480854-6">(</span><span class="n">opts</span><span class="p" data-group-id="5175480854-6">)</span><span class="w">
    </span><span class="k" data-group-id="5175480854-4">end</span><span class="w">
  </span><span class="k" data-group-id="5175480854-3">end</span><span class="w">
</span><span class="k" data-group-id="5175480854-1">end</span><span class="w">

</span><span class="kn">require</span><span class="w"> </span><span class="nc">MyLogic</span><span class="w">
</span><span class="nc">MyLogic</span><span class="o">.</span><span class="k">unless</span><span class="w"> </span><span class="no">false</span><span class="w"> </span><span class="k" data-group-id="5175480854-7">do</span><span class="w">
  </span><span class="nc">IO</span><span class="o">.</span><span class="n">puts</span><span class="w"> </span><span class="s">&quot;It works&quot;</span><span class="w">
</span><span class="k" data-group-id="5175480854-7">end</span></code></pre>
  </section>
</div>
<div class="detail" id="defmacrop/2">
  
    <span id="defmacrop/1"></span>
  <div class="detail-header">
    <a href="#defmacrop/2" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">defmacrop(call, expr \\ nil)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L3967" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Defines a private macro with the given name and body.</p>
<p>Private macros are only accessible from the same module in which they are
defined.</p>
<p>Check <a href="#defmacro/2"><code class="inline">defmacro/2</code></a> for more information, and check <a href="#def/2"><code class="inline">def/2</code></a> for rules on
naming and default arguments.</p>
  </section>
</div>
<div class="detail" id="defmodule/2">
    <div class="detail-header">
    <a href="#defmodule/2" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">defmodule(alias, do_block)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L3657" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Defines a module given by name with the given contents.</p>
<p>This macro defines a module with the given <code class="inline">alias</code> as its name and with the
given contents. It returns a tuple with four elements:</p>
<ul>
<li><code class="inline">:module</code>
</li>
<li>the module name
</li>
<li>the binary contents of the module
</li>
<li>the result of evaluating the contents block
</li>
</ul>
<h2 id="defmodule/2-examples" class="section-heading">
  <a href="#defmodule/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="kd">defmodule</span><span class="w"> </span><span class="nc">Foo</span><span class="w"> </span><span class="k" data-group-id="8606721381-1">do</span><span class="w">
</span><span class="gp unselectable">...&gt; </span><span class="w">  </span><span class="kd">def</span><span class="w"> </span><span class="nf">bar</span><span class="p">,</span><span class="w"> </span><span class="ss">do</span><span class="p">:</span><span class="w"> </span><span class="ss">:baz</span><span class="w">
</span><span class="gp unselectable">...&gt; </span><span class="k" data-group-id="8606721381-1">end</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="nc">Foo</span><span class="o">.</span><span class="n">bar</span><span class="p" data-group-id="8606721381-2">(</span><span class="p" data-group-id="8606721381-2">)</span><span class="w">
</span><span class="ss">:baz</span></code></pre>
<h2 id="defmodule/2-nesting" class="section-heading">
  <a href="#defmodule/2-nesting" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Nesting
</h2>

<p>Nesting a module inside another module affects the name of the nested module:</p>
<pre><code class="nohighlight makeup elixir"><span class="kd">defmodule</span><span class="w"> </span><span class="nc">Foo</span><span class="w"> </span><span class="k" data-group-id="3191002832-1">do</span><span class="w">
  </span><span class="kd">defmodule</span><span class="w"> </span><span class="nc">Bar</span><span class="w"> </span><span class="k" data-group-id="3191002832-2">do</span><span class="w">
  </span><span class="k" data-group-id="3191002832-2">end</span><span class="w">
</span><span class="k" data-group-id="3191002832-1">end</span></code></pre>
<p>In the example above, two modules - <code class="inline">Foo</code> and <code class="inline">Foo.Bar</code> - are created.
When nesting, Elixir automatically creates an alias to the inner module,
allowing the second module <code class="inline">Foo.Bar</code> to be accessed as <code class="inline">Bar</code> in the same
lexical scope where it’s defined (the <code class="inline">Foo</code> module).</p>
<p>If the <code class="inline">Foo.Bar</code> module is moved somewhere else, the references to <code class="inline">Bar</code> in
the <code class="inline">Foo</code> module need to be updated to the fully-qualified name (<code class="inline">Foo.Bar</code>) or
an alias has to be explicitly set in the <code class="inline">Foo</code> module with the help of
<a href="Kernel.SpecialForms.html#alias/2"><code class="inline">Kernel.SpecialForms.alias/2</code></a>.</p>
<pre><code class="nohighlight makeup elixir"><span class="kd">defmodule</span><span class="w"> </span><span class="nc">Foo.Bar</span><span class="w"> </span><span class="k" data-group-id="4152994404-1">do</span><span class="w">
  </span><span class="c1"># code</span><span class="w">
</span><span class="k" data-group-id="4152994404-1">end</span><span class="w">

</span><span class="kd">defmodule</span><span class="w"> </span><span class="nc">Foo</span><span class="w"> </span><span class="k" data-group-id="4152994404-2">do</span><span class="w">
  </span><span class="kn">alias</span><span class="w"> </span><span class="nc">Foo.Bar</span><span class="w">
  </span><span class="c1"># code here can refer to &quot;Foo.Bar&quot; as just &quot;Bar&quot;</span><span class="w">
</span><span class="k" data-group-id="4152994404-2">end</span></code></pre>
<h2 id="defmodule/2-module-names" class="section-heading">
  <a href="#defmodule/2-module-names" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Module names
</h2>

<p>A module name can be any atom, but Elixir provides a special syntax which is
usually used for module names. What is called a module name is an
<em>uppercase ASCII letter</em> followed by any number of <em>lowercase or
uppercase ASCII letters</em>, <em>numbers</em>, or <em>underscores</em>.
This identifier is equivalent to an atom prefixed by <code class="inline">Elixir.</code>. So in the
<code class="inline">defmodule Foo</code> example <code class="inline">Foo</code> is equivalent to <code class="inline">:&quot;Elixir.Foo&quot;</code></p>
<h2 id="defmodule/2-dynamic-names" class="section-heading">
  <a href="#defmodule/2-dynamic-names" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Dynamic names
</h2>

<p>Elixir module names can be dynamically generated. This is very
useful when working with macros. For instance, one could write:</p>
<pre><code class="nohighlight makeup elixir"><span class="kd">defmodule</span><span class="w"> </span><span class="nc">String</span><span class="o">.</span><span class="n">to_atom</span><span class="p" data-group-id="7262678300-1">(</span><span class="s">&quot;Foo</span><span class="si" data-group-id="7262678300-2">#{</span><span class="mi">1</span><span class="si" data-group-id="7262678300-2">}</span><span class="s">&quot;</span><span class="p" data-group-id="7262678300-1">)</span><span class="w"> </span><span class="k" data-group-id="7262678300-3">do</span><span class="w">
  </span><span class="c1"># contents ...</span><span class="w">
</span><span class="k" data-group-id="7262678300-3">end</span></code></pre>
<p>Elixir will accept any module name as long as the expression passed as the
first argument to <a href="#defmodule/2"><code class="inline">defmodule/2</code></a> evaluates to an atom.
Note that, when a dynamic name is used, Elixir won’t nest the name under the
current module nor automatically set up an alias.</p>
  </section>
</div>
<div class="detail" id="defoverridable/1">
    <div class="detail-header">
    <a href="#defoverridable/1" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">defoverridable(keywords_or_behaviour)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L4587" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Makes the given functions in the current module overridable.</p>
<p>An overridable function is lazily defined, allowing a developer to override
it.</p>
<h2 id="defoverridable/1-example" class="section-heading">
  <a href="#defoverridable/1-example" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Example
</h2>

<pre><code class="nohighlight makeup elixir"><span class="kd">defmodule</span><span class="w"> </span><span class="nc">DefaultMod</span><span class="w"> </span><span class="k" data-group-id="6443474015-1">do</span><span class="w">
  </span><span class="kd">defmacro</span><span class="w"> </span><span class="nf">__using__</span><span class="p" data-group-id="6443474015-2">(</span><span class="c">_opts</span><span class="p" data-group-id="6443474015-2">)</span><span class="w"> </span><span class="k" data-group-id="6443474015-3">do</span><span class="w">
    </span><span class="k">quote</span><span class="w"> </span><span class="k" data-group-id="6443474015-4">do</span><span class="w">
      </span><span class="kd">def</span><span class="w"> </span><span class="nf">test</span><span class="p" data-group-id="6443474015-5">(</span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="p" data-group-id="6443474015-5">)</span><span class="w"> </span><span class="k" data-group-id="6443474015-6">do</span><span class="w">
        </span><span class="n">x</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">y</span><span class="w">
      </span><span class="k" data-group-id="6443474015-6">end</span><span class="w">

      </span><span class="n">defoverridable</span><span class="w"> </span><span class="p" data-group-id="6443474015-7">[</span><span class="ss">test</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p" data-group-id="6443474015-7">]</span><span class="w">
    </span><span class="k" data-group-id="6443474015-4">end</span><span class="w">
  </span><span class="k" data-group-id="6443474015-3">end</span><span class="w">
</span><span class="k" data-group-id="6443474015-1">end</span><span class="w">

</span><span class="kd">defmodule</span><span class="w"> </span><span class="nc">InheritMod</span><span class="w"> </span><span class="k" data-group-id="6443474015-8">do</span><span class="w">
  </span><span class="kn">use</span><span class="w"> </span><span class="nc">DefaultMod</span><span class="w">

  </span><span class="kd">def</span><span class="w"> </span><span class="nf">test</span><span class="p" data-group-id="6443474015-9">(</span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="p" data-group-id="6443474015-9">)</span><span class="w"> </span><span class="k" data-group-id="6443474015-10">do</span><span class="w">
    </span><span class="n">x</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="k">super</span><span class="p" data-group-id="6443474015-11">(</span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="p" data-group-id="6443474015-11">)</span><span class="w">
  </span><span class="k" data-group-id="6443474015-10">end</span><span class="w">
</span><span class="k" data-group-id="6443474015-8">end</span></code></pre>
<p>As seen as in the example above, <code class="inline">super</code> can be used to call the default
implementation.</p>
<p>If <code class="inline">@behaviour</code> has been defined, <code class="inline">defoverridable</code> can also be called with a
module as an argument. All implemented callbacks from the behaviour above the
call to <code class="inline">defoverridable</code> will be marked as overridable.</p>
<h2 id="defoverridable/1-example" class="section-heading">
  <a href="#defoverridable/1-example" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Example
</h2>

<pre><code class="nohighlight makeup elixir"><span class="kd">defmodule</span><span class="w"> </span><span class="nc">Behaviour</span><span class="w"> </span><span class="k" data-group-id="8078695763-1">do</span><span class="w">
  </span><span class="na">@callback</span><span class="w"> </span><span class="n">foo</span><span class="w"> </span><span class="o">::</span><span class="w"> </span><span class="n">any</span><span class="w">
</span><span class="k" data-group-id="8078695763-1">end</span><span class="w">

</span><span class="kd">defmodule</span><span class="w"> </span><span class="nc">DefaultMod</span><span class="w"> </span><span class="k" data-group-id="8078695763-2">do</span><span class="w">
  </span><span class="kd">defmacro</span><span class="w"> </span><span class="nf">__using__</span><span class="p" data-group-id="8078695763-3">(</span><span class="c">_opts</span><span class="p" data-group-id="8078695763-3">)</span><span class="w"> </span><span class="k" data-group-id="8078695763-4">do</span><span class="w">
    </span><span class="k">quote</span><span class="w"> </span><span class="k" data-group-id="8078695763-5">do</span><span class="w">
      </span><span class="na">@behaviour</span><span class="w"> </span><span class="nc">Behaviour</span><span class="w">

      </span><span class="kd">def</span><span class="w"> </span><span class="nf">foo</span><span class="w"> </span><span class="k" data-group-id="8078695763-6">do</span><span class="w">
        </span><span class="s">&quot;Override me&quot;</span><span class="w">
      </span><span class="k" data-group-id="8078695763-6">end</span><span class="w">

      </span><span class="n">defoverridable</span><span class="w"> </span><span class="nc">Behaviour</span><span class="w">
    </span><span class="k" data-group-id="8078695763-5">end</span><span class="w">
  </span><span class="k" data-group-id="8078695763-4">end</span><span class="w">
</span><span class="k" data-group-id="8078695763-2">end</span><span class="w">

</span><span class="kd">defmodule</span><span class="w"> </span><span class="nc">InheritMod</span><span class="w"> </span><span class="k" data-group-id="8078695763-7">do</span><span class="w">
  </span><span class="kn">use</span><span class="w"> </span><span class="nc">DefaultMod</span><span class="w">

  </span><span class="kd">def</span><span class="w"> </span><span class="nf">foo</span><span class="w"> </span><span class="k" data-group-id="8078695763-8">do</span><span class="w">
    </span><span class="s">&quot;Overridden&quot;</span><span class="w">
  </span><span class="k" data-group-id="8078695763-8">end</span><span class="w">
</span><span class="k" data-group-id="8078695763-7">end</span></code></pre>
  </section>
</div>
<div class="detail" id="defp/2">
  
    <span id="defp/1"></span>
  <div class="detail-header">
    <a href="#defp/2" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">defp(call, expr \\ nil)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L3928" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Defines a private function with the given name and body.</p>
<p>Private functions are only accessible from within the module in which they are
defined. Trying to access a private function from outside the module it’s
defined in results in an <a href="UndefinedFunctionError.html"><code class="inline">UndefinedFunctionError</code></a> exception.</p>
<p>Check <a href="#def/2"><code class="inline">def/2</code></a> for more information.</p>
<h2 id="defp/2-examples" class="section-heading">
  <a href="#defp/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="kd">defmodule</span><span class="w"> </span><span class="nc">Foo</span><span class="w"> </span><span class="k" data-group-id="4914086275-1">do</span><span class="w">
  </span><span class="kd">def</span><span class="w"> </span><span class="nf">bar</span><span class="w"> </span><span class="k" data-group-id="4914086275-2">do</span><span class="w">
    </span><span class="n">sum</span><span class="p" data-group-id="4914086275-3">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p" data-group-id="4914086275-3">)</span><span class="w">
  </span><span class="k" data-group-id="4914086275-2">end</span><span class="w">

  </span><span class="kd">defp</span><span class="w"> </span><span class="nf">sum</span><span class="p" data-group-id="4914086275-4">(</span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="p" data-group-id="4914086275-4">)</span><span class="p">,</span><span class="w"> </span><span class="ss">do</span><span class="p">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">b</span><span class="w">
</span><span class="k" data-group-id="4914086275-1">end</span><span class="w">

</span><span class="nc">Foo</span><span class="o">.</span><span class="n">bar</span><span class="p" data-group-id="4914086275-5">(</span><span class="p" data-group-id="4914086275-5">)</span><span class="w"> </span><span class="c1">#=&gt; 3</span><span class="w">
</span><span class="nc">Foo</span><span class="o">.</span><span class="n">sum</span><span class="p" data-group-id="4914086275-6">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p" data-group-id="4914086275-6">)</span><span class="w"> </span><span class="c1">#=&gt; ** (UndefinedFunctionError) undefined function Foo.sum/2</span></code></pre>
  </section>
</div>
<div class="detail" id="defprotocol/2">
    <div class="detail-header">
    <a href="#defprotocol/2" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">defprotocol(name, do_block)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L4505" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Defines a protocol.</p>
<p>A protocol specifies an API that should be defined by its
implementations.</p>
<h2 id="defprotocol/2-examples" class="section-heading">
  <a href="#defprotocol/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<p>In Elixir, we have two verbs for checking how many items there
are in a data structure: <code class="inline">length</code> and <code class="inline">size</code>.  <code class="inline">length</code> means the
information must be computed. For example, <code class="inline">length(list)</code> needs to
traverse the whole list to calculate its length. On the other hand,
<code class="inline">tuple_size(tuple)</code> and <code class="inline">byte_size(binary)</code> do not depend on the
tuple and binary size as the size information is precomputed in
the data structure.</p>
<p>Although Elixir includes specific functions such as <code class="inline">tuple_size</code>,
<code class="inline">binary_size</code> and <code class="inline">map_size</code>, sometimes we want to be able to
retrieve the size of a data structure regardless of its type.
In Elixir we can write polymorphic code, i.e. code that works
with different shapes/types, by using protocols. A size protocol
could be implemented as follows:</p>
<pre><code class="nohighlight makeup elixir"><span class="kd">defprotocol</span><span class="w"> </span><span class="nc">Size</span><span class="w"> </span><span class="k" data-group-id="4457610511-1">do</span><span class="w">
  </span><span class="na">@doc</span><span class="w"> </span><span class="s">&quot;Calculates the size (and not the length!) of a data structure&quot;</span><span class="w">
  </span><span class="kd">def</span><span class="w"> </span><span class="nf">size</span><span class="p" data-group-id="4457610511-2">(</span><span class="n">data</span><span class="p" data-group-id="4457610511-2">)</span><span class="w">
</span><span class="k" data-group-id="4457610511-1">end</span></code></pre>
<p>Now that the protocol can be implemented for every data structure
the protocol may have a compliant implementation for:</p>
<pre><code class="nohighlight makeup elixir"><span class="kd">defimpl</span><span class="w"> </span><span class="nc">Size</span><span class="p">,</span><span class="w"> </span><span class="ss">for</span><span class="p">:</span><span class="w"> </span><span class="nc">BitString</span><span class="w"> </span><span class="k" data-group-id="0861037918-1">do</span><span class="w">
  </span><span class="kd">def</span><span class="w"> </span><span class="nf">size</span><span class="p" data-group-id="0861037918-2">(</span><span class="n">binary</span><span class="p" data-group-id="0861037918-2">)</span><span class="p">,</span><span class="w"> </span><span class="ss">do</span><span class="p">:</span><span class="w"> </span><span class="n">byte_size</span><span class="p" data-group-id="0861037918-3">(</span><span class="n">binary</span><span class="p" data-group-id="0861037918-3">)</span><span class="w">
</span><span class="k" data-group-id="0861037918-1">end</span><span class="w">

</span><span class="kd">defimpl</span><span class="w"> </span><span class="nc">Size</span><span class="p">,</span><span class="w"> </span><span class="ss">for</span><span class="p">:</span><span class="w"> </span><span class="nc">Map</span><span class="w"> </span><span class="k" data-group-id="0861037918-4">do</span><span class="w">
  </span><span class="kd">def</span><span class="w"> </span><span class="nf">size</span><span class="p" data-group-id="0861037918-5">(</span><span class="n">map</span><span class="p" data-group-id="0861037918-5">)</span><span class="p">,</span><span class="w"> </span><span class="ss">do</span><span class="p">:</span><span class="w"> </span><span class="n">map_size</span><span class="p" data-group-id="0861037918-6">(</span><span class="n">map</span><span class="p" data-group-id="0861037918-6">)</span><span class="w">
</span><span class="k" data-group-id="0861037918-4">end</span><span class="w">

</span><span class="kd">defimpl</span><span class="w"> </span><span class="nc">Size</span><span class="p">,</span><span class="w"> </span><span class="ss">for</span><span class="p">:</span><span class="w"> </span><span class="nc">Tuple</span><span class="w"> </span><span class="k" data-group-id="0861037918-7">do</span><span class="w">
  </span><span class="kd">def</span><span class="w"> </span><span class="nf">size</span><span class="p" data-group-id="0861037918-8">(</span><span class="n">tuple</span><span class="p" data-group-id="0861037918-8">)</span><span class="p">,</span><span class="w"> </span><span class="ss">do</span><span class="p">:</span><span class="w"> </span><span class="n">tuple_size</span><span class="p" data-group-id="0861037918-9">(</span><span class="n">tuple</span><span class="p" data-group-id="0861037918-9">)</span><span class="w">
</span><span class="k" data-group-id="0861037918-7">end</span></code></pre>
<p>Notice we didn’t implement it for lists as we don’t have the
<code class="inline">size</code> information on lists, rather its value needs to be
computed with <code class="inline">length</code>.</p>
<p>It is possible to implement protocols for all Elixir types:</p>
<ul>
<li>Structs (see below)
</li>
<li><a href="Tuple.html"><code class="inline">Tuple</code></a>
</li>
<li><a href="Atom.html"><code class="inline">Atom</code></a>
</li>
<li><a href="List.html"><code class="inline">List</code></a>
</li>
<li><code class="inline">BitString</code>
</li>
<li><a href="Integer.html"><code class="inline">Integer</code></a>
</li>
<li><a href="Float.html"><code class="inline">Float</code></a>
</li>
<li><a href="Function.html"><code class="inline">Function</code></a>
</li>
<li><code class="inline">PID</code>
</li>
<li><a href="Map.html"><code class="inline">Map</code></a>
</li>
<li><a href="Port.html"><code class="inline">Port</code></a>
</li>
<li><code class="inline">Reference</code>
</li>
<li><code class="inline">Any</code> (see below)
</li>
</ul>
<h2 id="defprotocol/2-protocols-and-structs" class="section-heading">
  <a href="#defprotocol/2-protocols-and-structs" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Protocols and Structs
</h2>

<p>The real benefit of protocols comes when mixed with structs.
For instance, Elixir ships with many data types implemented as
structs, like <a href="MapSet.html"><code class="inline">MapSet</code></a>. We can implement the <code class="inline">Size</code> protocol
for those types as well:</p>
<pre><code class="nohighlight makeup elixir"><span class="kd">defimpl</span><span class="w"> </span><span class="nc">Size</span><span class="p">,</span><span class="w"> </span><span class="ss">for</span><span class="p">:</span><span class="w"> </span><span class="nc">MapSet</span><span class="w"> </span><span class="k" data-group-id="5384253817-1">do</span><span class="w">
  </span><span class="kd">def</span><span class="w"> </span><span class="nf">size</span><span class="p" data-group-id="5384253817-2">(</span><span class="n">map_set</span><span class="p" data-group-id="5384253817-2">)</span><span class="p">,</span><span class="w"> </span><span class="ss">do</span><span class="p">:</span><span class="w"> </span><span class="nc">MapSet</span><span class="o">.</span><span class="n">size</span><span class="p" data-group-id="5384253817-3">(</span><span class="n">map_set</span><span class="p" data-group-id="5384253817-3">)</span><span class="w">
</span><span class="k" data-group-id="5384253817-1">end</span></code></pre>
<p>When implementing a protocol for a struct, the <code class="inline">:for</code> option can
be omitted if the <code class="inline">defimpl</code> call is inside the module that defines
the struct:</p>
<pre><code class="nohighlight makeup elixir"><span class="kd">defmodule</span><span class="w"> </span><span class="nc">User</span><span class="w"> </span><span class="k" data-group-id="4364801354-1">do</span><span class="w">
  </span><span class="kd">defstruct</span><span class="w"> </span><span class="p" data-group-id="4364801354-2">[</span><span class="ss">:email</span><span class="p">,</span><span class="w"> </span><span class="ss">:name</span><span class="p" data-group-id="4364801354-2">]</span><span class="w">

  </span><span class="kd">defimpl</span><span class="w"> </span><span class="nc">Size</span><span class="w"> </span><span class="k" data-group-id="4364801354-3">do</span><span class="w">
    </span><span class="kd">def</span><span class="w"> </span><span class="nf">size</span><span class="p" data-group-id="4364801354-4">(</span><span class="p" data-group-id="4364801354-5">%</span><span class="nc" data-group-id="4364801354-5">User</span><span class="p" data-group-id="4364801354-5">{</span><span class="p" data-group-id="4364801354-5">}</span><span class="p" data-group-id="4364801354-4">)</span><span class="p">,</span><span class="w"> </span><span class="ss">do</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="c1"># two fields</span><span class="w">
  </span><span class="k" data-group-id="4364801354-3">end</span><span class="w">
</span><span class="k" data-group-id="4364801354-1">end</span></code></pre>
<p>If a protocol implementation is not found for a given type,
invoking the protocol will raise unless it is configured to
fallback to <code class="inline">Any</code>. Conveniences for building implementations
on top of existing ones are also available, look at <a href="#defstruct/1"><code class="inline">defstruct/1</code></a>
for more information about deriving
protocols.</p>
<h2 id="defprotocol/2-fallback-to-any" class="section-heading">
  <a href="#defprotocol/2-fallback-to-any" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Fallback to any
</h2>

<p>In some cases, it may be convenient to provide a default
implementation for all types. This can be achieved by setting
the <code class="inline">@fallback_to_any</code> attribute to <code class="inline">true</code> in the protocol
definition:</p>
<pre><code class="nohighlight makeup elixir"><span class="kd">defprotocol</span><span class="w"> </span><span class="nc">Size</span><span class="w"> </span><span class="k" data-group-id="5555163629-1">do</span><span class="w">
  </span><span class="na">@fallback_to_any</span><span class="w"> </span><span class="no">true</span><span class="w">
  </span><span class="kd">def</span><span class="w"> </span><span class="nf">size</span><span class="p" data-group-id="5555163629-2">(</span><span class="n">data</span><span class="p" data-group-id="5555163629-2">)</span><span class="w">
</span><span class="k" data-group-id="5555163629-1">end</span></code></pre>
<p>The <code class="inline">Size</code> protocol can now be implemented for <code class="inline">Any</code>:</p>
<pre><code class="nohighlight makeup elixir"><span class="kd">defimpl</span><span class="w"> </span><span class="nc">Size</span><span class="p">,</span><span class="w"> </span><span class="ss">for</span><span class="p">:</span><span class="w"> </span><span class="nc">Any</span><span class="w"> </span><span class="k" data-group-id="9434807438-1">do</span><span class="w">
  </span><span class="kd">def</span><span class="w"> </span><span class="nf">size</span><span class="p" data-group-id="9434807438-2">(</span><span class="bp">_</span><span class="p" data-group-id="9434807438-2">)</span><span class="p">,</span><span class="w"> </span><span class="ss">do</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="w">
</span><span class="k" data-group-id="9434807438-1">end</span></code></pre>
<p>Although the implementation above is arguably not a reasonable
one. For example, it makes no sense to say a PID or an Integer
have a size of 0. That’s one of the reasons why <code class="inline">@fallback_to_any</code>
is an opt-in behaviour. For the majority of protocols, raising
an error when a protocol is not implemented is the proper behaviour.</p>
<h2 id="defprotocol/2-multiple-implementations" class="section-heading">
  <a href="#defprotocol/2-multiple-implementations" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Multiple implementations
</h2>

<p>Protocols can also be implemented for multiple types at once:</p>
<pre><code class="nohighlight makeup elixir"><span class="kd">defprotocol</span><span class="w"> </span><span class="nc">Reversible</span><span class="w"> </span><span class="k" data-group-id="6729948609-1">do</span><span class="w">
  </span><span class="kd">def</span><span class="w"> </span><span class="nf">reverse</span><span class="p" data-group-id="6729948609-2">(</span><span class="n">term</span><span class="p" data-group-id="6729948609-2">)</span><span class="w">
</span><span class="k" data-group-id="6729948609-1">end</span><span class="w">

</span><span class="kd">defimpl</span><span class="w"> </span><span class="nc">Reversible</span><span class="p">,</span><span class="w"> </span><span class="ss">for</span><span class="p">:</span><span class="w"> </span><span class="p" data-group-id="6729948609-3">[</span><span class="nc">Map</span><span class="p">,</span><span class="w"> </span><span class="nc">List</span><span class="p" data-group-id="6729948609-3">]</span><span class="w"> </span><span class="k" data-group-id="6729948609-4">do</span><span class="w">
  </span><span class="kd">def</span><span class="w"> </span><span class="nf">reverse</span><span class="p" data-group-id="6729948609-5">(</span><span class="n">term</span><span class="p" data-group-id="6729948609-5">)</span><span class="p">,</span><span class="w"> </span><span class="ss">do</span><span class="p">:</span><span class="w"> </span><span class="nc">Enum</span><span class="o">.</span><span class="n">reverse</span><span class="p" data-group-id="6729948609-6">(</span><span class="n">term</span><span class="p" data-group-id="6729948609-6">)</span><span class="w">
</span><span class="k" data-group-id="6729948609-4">end</span></code></pre>
<h2 id="defprotocol/2-types" class="section-heading">
  <a href="#defprotocol/2-types" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Types
</h2>

<p>Defining a protocol automatically defines a type named <code class="inline">t</code>, which
can be used as follows:</p>
<pre><code class="nohighlight makeup elixir"><span class="na">@spec</span><span class="w"> </span><span class="n">print_size</span><span class="p" data-group-id="9338684070-1">(</span><span class="nc">Size</span><span class="o">.</span><span class="n">t</span><span class="p" data-group-id="9338684070-1">)</span><span class="w"> </span><span class="o">::</span><span class="w"> </span><span class="ss">:ok</span><span class="w">
</span><span class="kd">def</span><span class="w"> </span><span class="nf">print_size</span><span class="p" data-group-id="9338684070-2">(</span><span class="n">data</span><span class="p" data-group-id="9338684070-2">)</span><span class="w"> </span><span class="k" data-group-id="9338684070-3">do</span><span class="w">
  </span><span class="nc">IO</span><span class="o">.</span><span class="n">puts</span><span class="p" data-group-id="9338684070-4">(</span><span class="k">case</span><span class="w"> </span><span class="nc">Size</span><span class="o">.</span><span class="n">size</span><span class="p" data-group-id="9338684070-5">(</span><span class="n">data</span><span class="p" data-group-id="9338684070-5">)</span><span class="w"> </span><span class="k" data-group-id="9338684070-6">do</span><span class="w">
    </span><span class="mi">0</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="s">&quot;data has no items&quot;</span><span class="w">
    </span><span class="mi">1</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="s">&quot;data has one item&quot;</span><span class="w">
    </span><span class="n">n</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="s">&quot;data has </span><span class="si" data-group-id="9338684070-7">#{</span><span class="n">n</span><span class="si" data-group-id="9338684070-7">}</span><span class="s"> items&quot;</span><span class="w">
  </span><span class="k" data-group-id="9338684070-6">end</span><span class="p" data-group-id="9338684070-4">)</span><span class="w">
</span><span class="k" data-group-id="9338684070-3">end</span></code></pre>
<p>The <code class="inline">@spec</code> above expresses that all types allowed to implement the
given protocol are valid argument types for the given function.</p>
<h2 id="defprotocol/2-reflection" class="section-heading">
  <a href="#defprotocol/2-reflection" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Reflection
</h2>

<p>Any protocol module contains three extra functions:</p>
<ul>
<li><p><code class="inline">__protocol__/1</code> - returns the protocol name when <code class="inline">:name</code> is given, a
keyword list with the protocol functions and their arities when
<code class="inline">:functions</code> is given, and a list of the implementations when <code class="inline">:impls</code> is
given</p>
</li>
<li><p><code class="inline">impl_for/1</code> - receives a structure and returns the module that
implements the protocol for the structure, <code class="inline">nil</code> otherwise</p>
</li>
<li><p><code class="inline">impl_for!/1</code> - same as above but raises an error if an implementation is
not found</p>
<pre><code class="nohighlight makeup elixir"><span class="nc">Enumerable</span><span class="o">.</span><span class="c">__protocol__</span><span class="p" data-group-id="8304043398-1">(</span><span class="ss">:functions</span><span class="p" data-group-id="8304043398-1">)</span><span class="w">
</span><span class="c1">#=&gt; [count: 1, member?: 2, reduce: 3]</span><span class="w">

</span><span class="nc">Enumerable</span><span class="o">.</span><span class="n">impl_for</span><span class="p" data-group-id="8304043398-2">(</span><span class="p" data-group-id="8304043398-3">[</span><span class="p" data-group-id="8304043398-3">]</span><span class="p" data-group-id="8304043398-2">)</span><span class="w">
</span><span class="c1">#=&gt; Enumerable.List</span><span class="w">

</span><span class="nc">Enumerable</span><span class="o">.</span><span class="n">impl_for</span><span class="p" data-group-id="8304043398-4">(</span><span class="mi">42</span><span class="p" data-group-id="8304043398-4">)</span><span class="w">
</span><span class="c1">#=&gt; nil</span></code></pre>
</li>
</ul>
<h2 id="defprotocol/2-consolidation" class="section-heading">
  <a href="#defprotocol/2-consolidation" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Consolidation
</h2>

<p>In order to cope with code loading in development, protocols in
Elixir provide a slow implementation of protocol dispatching specific
to development.</p>
<p>In order to speed up dispatching in production environments, where
all implementations are known up-front, Elixir provides a feature
called protocol consolidation. Consolidation directly links protocols
to their implementations in a way that invoking a function from a
consolidated protocol is equivalent to invoking two remote functions.</p>
<p>Protocol consolidation is applied by default to all Mix projects during
compilation. This may be an issue during test. For instance, if you want
to implement a protocol during test, the implementation will have no
effect, as the protocol has already been consolidated. One possible
solution is to include compilation directories that are specific to your
test environment in your mix.exs:</p>
<pre><code class="nohighlight makeup elixir"><span class="kd">def</span><span class="w"> </span><span class="nf">project</span><span class="w"> </span><span class="k" data-group-id="9962496108-1">do</span><span class="w">
  </span><span class="n">...</span><span class="w">
  </span><span class="ss">elixirc_paths</span><span class="p">:</span><span class="w"> </span><span class="n">elixirc_paths</span><span class="p" data-group-id="9962496108-2">(</span><span class="nc">Mix</span><span class="o">.</span><span class="n">env</span><span class="p" data-group-id="9962496108-2">)</span><span class="w">
  </span><span class="n">...</span><span class="w">
</span><span class="k" data-group-id="9962496108-1">end</span><span class="w">

</span><span class="kd">defp</span><span class="w"> </span><span class="nf">elixirc_paths</span><span class="p" data-group-id="9962496108-3">(</span><span class="ss">:test</span><span class="p" data-group-id="9962496108-3">)</span><span class="p">,</span><span class="w"> </span><span class="ss">do</span><span class="p">:</span><span class="w"> </span><span class="p" data-group-id="9962496108-4">[</span><span class="s">&quot;lib&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;test/support&quot;</span><span class="p" data-group-id="9962496108-4">]</span><span class="w">
</span><span class="kd">defp</span><span class="w"> </span><span class="nf">elixirc_paths</span><span class="p" data-group-id="9962496108-5">(</span><span class="bp">_</span><span class="p" data-group-id="9962496108-5">)</span><span class="p">,</span><span class="w"> </span><span class="ss">do</span><span class="p">:</span><span class="w"> </span><span class="p" data-group-id="9962496108-6">[</span><span class="s">&quot;lib&quot;</span><span class="p" data-group-id="9962496108-6">]</span></code></pre>
<p>And then you can define the implementations specific to the test environment
inside <code class="inline">test/support/some_file.ex</code>.</p>
<p>Another approach is to disable protocol consolidation during tests in your
mix.exs:</p>
<pre><code class="nohighlight makeup elixir"><span class="kd">def</span><span class="w"> </span><span class="nf">project</span><span class="w"> </span><span class="k" data-group-id="4172986610-1">do</span><span class="w">
  </span><span class="n">...</span><span class="w">
  </span><span class="ss">consolidate_protocols</span><span class="p">:</span><span class="w"> </span><span class="nc">Mix</span><span class="o">.</span><span class="n">env</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="ss">:test</span><span class="w">
  </span><span class="n">...</span><span class="w">
</span><span class="k" data-group-id="4172986610-1">end</span></code></pre>
<p>Although doing so is not recommended as it may affect your test suite
performance.</p>
<p>Finally note all protocols are compiled with <code class="inline">debug_info</code> set to <code class="inline">true</code>,
regardless of the option set by <code class="inline">elixirc</code> compiler. The debug info is
used for consolidation and it may be removed after consolidation.</p>
  </section>
</div>
<div class="detail" id="defstruct/1">
    <div class="detail-header">
    <a href="#defstruct/1" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">defstruct(fields)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L4118" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Defines a struct.</p>
<p>A struct is a tagged map that allows developers to provide
default values for keys, tags to be used in polymorphic
dispatches and compile time assertions.</p>
<p>To define a struct, a developer must define both <code class="inline">__struct__/0</code> and
<code class="inline">__struct__/1</code> functions. <a href="#defstruct/1"><code class="inline">defstruct/1</code></a> is a convenience macro which
defines such functions with some conveniences.</p>
<p>For more information about structs, please check <a href="Kernel.SpecialForms.html#%2525/2"><code class="inline">Kernel.SpecialForms.%/2</code></a>.</p>
<h2 id="defstruct/1-examples" class="section-heading">
  <a href="#defstruct/1-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="kd">defmodule</span><span class="w"> </span><span class="nc">User</span><span class="w"> </span><span class="k" data-group-id="6938304336-1">do</span><span class="w">
  </span><span class="kd">defstruct</span><span class="w"> </span><span class="ss">name</span><span class="p">:</span><span class="w"> </span><span class="no">nil</span><span class="p">,</span><span class="w"> </span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="no">nil</span><span class="w">
</span><span class="k" data-group-id="6938304336-1">end</span></code></pre>
<p>Struct fields are evaluated at compile-time, which allows
them to be dynamic. In the example below, <code class="inline">10 + 11</code> is
evaluated at compile-time and the age field is stored
with value <code class="inline">21</code>:</p>
<pre><code class="nohighlight makeup elixir"><span class="kd">defmodule</span><span class="w"> </span><span class="nc">User</span><span class="w"> </span><span class="k" data-group-id="5616694294-1">do</span><span class="w">
  </span><span class="kd">defstruct</span><span class="w"> </span><span class="ss">name</span><span class="p">:</span><span class="w"> </span><span class="no">nil</span><span class="p">,</span><span class="w"> </span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">10</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">11</span><span class="w">
</span><span class="k" data-group-id="5616694294-1">end</span></code></pre>
<p>The <code class="inline">fields</code> argument is usually a keyword list with field names
as atom keys and default values as corresponding values. <a href="#defstruct/1"><code class="inline">defstruct/1</code></a>
also supports a list of atoms as its argument: in that case, the atoms
in the list will be used as the struct’s field names and they will all
default to <code class="inline">nil</code>.</p>
<pre><code class="nohighlight makeup elixir"><span class="kd">defmodule</span><span class="w"> </span><span class="nc">Post</span><span class="w"> </span><span class="k" data-group-id="7487958972-1">do</span><span class="w">
  </span><span class="kd">defstruct</span><span class="w"> </span><span class="p" data-group-id="7487958972-2">[</span><span class="ss">:title</span><span class="p">,</span><span class="w"> </span><span class="ss">:content</span><span class="p">,</span><span class="w"> </span><span class="ss">:author</span><span class="p" data-group-id="7487958972-2">]</span><span class="w">
</span><span class="k" data-group-id="7487958972-1">end</span></code></pre>
<h2 id="defstruct/1-deriving" class="section-heading">
  <a href="#defstruct/1-deriving" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Deriving
</h2>

<p>Although structs are maps, by default structs do not implement
any of the protocols implemented for maps. For example, attempting
to use a protocol with the <code class="inline">User</code> struct leads to an error:</p>
<pre><code class="nohighlight makeup elixir"><span class="n">john</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p" data-group-id="3153453737-1">%</span><span class="nc" data-group-id="3153453737-1">User</span><span class="p" data-group-id="3153453737-1">{</span><span class="ss">name</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;John&quot;</span><span class="p" data-group-id="3153453737-1">}</span><span class="w">
</span><span class="nc">MyProtocol</span><span class="o">.</span><span class="n">call</span><span class="p" data-group-id="3153453737-2">(</span><span class="n">john</span><span class="p" data-group-id="3153453737-2">)</span><span class="w">
</span><span class="gt">** (Protocol.UndefinedError) protocol MyProtocol not implemented for %User{...}</span></code></pre>
<p><a href="#defstruct/1"><code class="inline">defstruct/1</code></a>, however, allows protocol implementations to be
<em>derived</em>. This can be done by defining a <code class="inline">@derive</code> attribute as a
list before invoking <a href="#defstruct/1"><code class="inline">defstruct/1</code></a>:</p>
<pre><code class="nohighlight makeup elixir"><span class="kd">defmodule</span><span class="w"> </span><span class="nc">User</span><span class="w"> </span><span class="k" data-group-id="9645042373-1">do</span><span class="w">
  </span><span class="na">@derive</span><span class="w"> </span><span class="p" data-group-id="9645042373-2">[</span><span class="nc">MyProtocol</span><span class="p" data-group-id="9645042373-2">]</span><span class="w">
  </span><span class="kd">defstruct</span><span class="w"> </span><span class="ss">name</span><span class="p">:</span><span class="w"> </span><span class="no">nil</span><span class="p">,</span><span class="w"> </span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">10</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">11</span><span class="w">
</span><span class="k" data-group-id="9645042373-1">end</span><span class="w">

</span><span class="nc">MyProtocol</span><span class="o">.</span><span class="n">call</span><span class="p" data-group-id="9645042373-3">(</span><span class="n">john</span><span class="p" data-group-id="9645042373-3">)</span><span class="w"> </span><span class="c1">#=&gt; works</span></code></pre>
<p>For each protocol in the <code class="inline">@derive</code> list, Elixir will assert there is an
implementation of that protocol for any (regardless if fallback to any
is <code class="inline">true</code>) and check if the any implementation defines a <code class="inline">__deriving__/3</code>
callback (via <a href="Protocol.html#derive/3"><code class="inline">Protocol.derive/3</code></a>). If so, the callback is invoked,
otherwise an implementation that simply points to the any implementation
is automatically derived.</p>
<h2 id="defstruct/1-enforcing-keys" class="section-heading">
  <a href="#defstruct/1-enforcing-keys" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Enforcing keys
</h2>

<p>When building a struct, Elixir will automatically guarantee all keys
belongs to the struct:</p>
<pre><code class="nohighlight makeup elixir"><span class="p" data-group-id="2877804435-1">%</span><span class="nc" data-group-id="2877804435-1">User</span><span class="p" data-group-id="2877804435-1">{</span><span class="ss">name</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;john&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">unknown</span><span class="p">:</span><span class="w"> </span><span class="ss">:key</span><span class="p" data-group-id="2877804435-1">}</span><span class="w">
</span><span class="gt">** (KeyError) key :unknown not found in: %User{age: 21, name: nil}</span></code></pre>
<p>Elixir also allows developers to enforce certain keys must always be
given when building the struct:</p>
<pre><code class="nohighlight makeup elixir"><span class="kd">defmodule</span><span class="w"> </span><span class="nc">User</span><span class="w"> </span><span class="k" data-group-id="0398627570-1">do</span><span class="w">
  </span><span class="na">@enforce_keys</span><span class="w"> </span><span class="p" data-group-id="0398627570-2">[</span><span class="ss">:name</span><span class="p" data-group-id="0398627570-2">]</span><span class="w">
  </span><span class="kd">defstruct</span><span class="w"> </span><span class="ss">name</span><span class="p">:</span><span class="w"> </span><span class="no">nil</span><span class="p">,</span><span class="w"> </span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">10</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">11</span><span class="w">
</span><span class="k" data-group-id="0398627570-1">end</span></code></pre>
<p>Now trying to build a struct without the name key will fail:</p>
<pre><code class="nohighlight makeup elixir"><span class="p" data-group-id="1931878460-1">%</span><span class="nc" data-group-id="1931878460-1">User</span><span class="p" data-group-id="1931878460-1">{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">21</span><span class="p" data-group-id="1931878460-1">}</span><span class="w">
</span><span class="gt">** (ArgumentError) the following keys must also be given when building struct User: [:name]</span></code></pre>
<p>Keep in mind <code class="inline">@enforce_keys</code> is a simple compile-time guarantee
to aid developers when building structs. It is not enforced on
updates and it does not provide any sort of value-validation.</p>
<h2 id="defstruct/1-types" class="section-heading">
  <a href="#defstruct/1-types" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Types
</h2>

<p>It is recommended to define types for structs. By convention such type
is called <code class="inline">t</code>. To define a struct inside a type, the struct literal syntax
is used:</p>
<pre><code class="nohighlight makeup elixir"><span class="kd">defmodule</span><span class="w"> </span><span class="nc">User</span><span class="w"> </span><span class="k" data-group-id="1384102510-1">do</span><span class="w">
  </span><span class="kd">defstruct</span><span class="w"> </span><span class="ss">name</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;John&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">25</span><span class="w">
  </span><span class="na">@type</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="o">::</span><span class="w"> </span><span class="p" data-group-id="1384102510-2">%</span><span class="nc" data-group-id="1384102510-2">User</span><span class="p" data-group-id="1384102510-2">{</span><span class="ss">name</span><span class="p">:</span><span class="w"> </span><span class="nc">String</span><span class="o">.</span><span class="n">t</span><span class="p">,</span><span class="w"> </span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="n">non_neg_integer</span><span class="p" data-group-id="1384102510-2">}</span><span class="w">
</span><span class="k" data-group-id="1384102510-1">end</span></code></pre>
<p>It is recommended to only use the struct syntax when defining the struct’s
type. When referring to another struct it’s better to use <code class="inline">User.t</code> instead of
<code class="inline">%User{}</code>.</p>
<p>The types of the struct fields that are not included in <code class="inline">%User{}</code> default to
<code class="inline">term</code>.</p>
<p>Structs whose internal structure is private to the local module (pattern
matching them or directly accessing their fields should not be allowed) should
use the <code class="inline">@opaque</code> attribute. Structs whose internal structure is public should
use <code class="inline">@type</code>.</p>
  </section>
</div>
<div class="detail" id="destructure/2">
    <div class="detail-header">
    <a href="#destructure/2" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">destructure(left, right)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L3001" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Destructures two lists, assigning each term in the
right one to the matching term in the left one.</p>
<p>Unlike pattern matching via <code class="inline">=</code>, if the sizes of the left
and right lists don’t match, destructuring simply stops
instead of raising an error.</p>
<h2 id="destructure/2-examples" class="section-heading">
  <a href="#destructure/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">destructure</span><span class="p" data-group-id="6807678073-1">(</span><span class="p" data-group-id="6807678073-2">[</span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="p">,</span><span class="w"> </span><span class="n">z</span><span class="p" data-group-id="6807678073-2">]</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="6807678073-3">[</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="p" data-group-id="6807678073-3">]</span><span class="p" data-group-id="6807678073-1">)</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="p" data-group-id="6807678073-4">{</span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="p">,</span><span class="w"> </span><span class="n">z</span><span class="p" data-group-id="6807678073-4">}</span><span class="w">
</span><span class="p" data-group-id="6807678073-5">{</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p" data-group-id="6807678073-5">}</span></code></pre>
<p>In the example above, even though the right list has more entries than the
left one, destructuring works fine. If the right list is smaller, the
remaining items are simply set to <code class="inline">nil</code>:</p>
<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">destructure</span><span class="p" data-group-id="9535534557-1">(</span><span class="p" data-group-id="9535534557-2">[</span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="p">,</span><span class="w"> </span><span class="n">z</span><span class="p" data-group-id="9535534557-2">]</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="9535534557-3">[</span><span class="mi">1</span><span class="p" data-group-id="9535534557-3">]</span><span class="p" data-group-id="9535534557-1">)</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="p" data-group-id="9535534557-4">{</span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="p">,</span><span class="w"> </span><span class="n">z</span><span class="p" data-group-id="9535534557-4">}</span><span class="w">
</span><span class="p" data-group-id="9535534557-5">{</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="no">nil</span><span class="p">,</span><span class="w"> </span><span class="no">nil</span><span class="p" data-group-id="9535534557-5">}</span></code></pre>
<p>The left-hand side supports any expression you would use
on the left-hand side of a match:</p>
<pre><code class="nohighlight makeup elixir"><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1</span><span class="w">
</span><span class="n">destructure</span><span class="p" data-group-id="6718539848-1">(</span><span class="p" data-group-id="6718539848-2">[</span><span class="o">^</span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="p">,</span><span class="w"> </span><span class="n">z</span><span class="p" data-group-id="6718539848-2">]</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="6718539848-3">[</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p" data-group-id="6718539848-3">]</span><span class="p" data-group-id="6718539848-1">)</span></code></pre>
<p>The example above will only work if <code class="inline">x</code> matches the first value in the right
list. Otherwise, it will raise a <a href="MatchError.html"><code class="inline">MatchError</code></a> (like the <code class="inline">=</code> operator would
do).</p>
  </section>
</div>
<div class="detail" id="div/2">
    <div class="detail-header">
    <a href="#div/2" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">div(dividend, divisor)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L335" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>div(<a href="typespecs.html#basic-types">integer</a>(), <a href="typespecs.html#basic-types">neg_integer</a>() | <a href="typespecs.html#basic-types">pos_integer</a>()) :: <a href="typespecs.html#basic-types">integer</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Performs an integer division.</p>
<p>Raises an <a href="ArithmeticError.html"><code class="inline">ArithmeticError</code></a> exception if one of the arguments is not an
integer, or when the <code class="inline">divisor</code> is <code class="inline">0</code>.</p>
<p><a href="#div/2"><code class="inline">div/2</code></a> performs <em>truncated</em> integer division. This means that
the result is always rounded towards zero.</p>
<p>If you want to perform floored integer division (rounding towards negative infinity),
use <a href="Integer.html#floor_div/2"><code class="inline">Integer.floor_div/2</code></a> instead.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
<h2 id="div/2-examples" class="section-heading">
  <a href="#div/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="n">div</span><span class="p" data-group-id="6668659399-1">(</span><span class="mi">5</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p" data-group-id="6668659399-1">)</span><span class="w">
</span><span class="c1">#=&gt; 2</span><span class="w">

</span><span class="n">div</span><span class="p" data-group-id="6668659399-2">(</span><span class="mi">6</span><span class="p">,</span><span class="w"> </span><span class="o">-</span><span class="mi">4</span><span class="p" data-group-id="6668659399-2">)</span><span class="w">
</span><span class="c1">#=&gt; -1</span><span class="w">

</span><span class="n">div</span><span class="p" data-group-id="6668659399-3">(</span><span class="o">-</span><span class="mi">99</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p" data-group-id="6668659399-3">)</span><span class="w">
</span><span class="c1">#=&gt; -49</span><span class="w">

</span><span class="n">div</span><span class="p" data-group-id="6668659399-4">(</span><span class="mi">100</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p" data-group-id="6668659399-4">)</span><span class="w">
</span><span class="c1">#=&gt; ** (ArithmeticError) bad argument in arithmetic expression</span></code></pre>
  </section>
</div>
<div class="detail" id="elem/2">
    <div class="detail-header">
    <a href="#elem/2" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">elem(tuple, index)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L1458" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>elem(<a href="typespecs.html#basic-types">tuple</a>(), <a href="typespecs.html#basic-types">non_neg_integer</a>()) :: <a href="typespecs.html#built-in-types">term</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Gets the element at the zero-based <code class="inline">index</code> in <code class="inline">tuple</code>.</p>
<p>It raises <a href="ArgumentError.html"><code class="inline">ArgumentError</code></a> when index is negative or it is out of range of the tuple elements.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
<h2 id="elem/2-examples" class="section-heading">
  <a href="#elem/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="n">tuple</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p" data-group-id="1325293134-1">{</span><span class="ss">:foo</span><span class="p">,</span><span class="w"> </span><span class="ss">:bar</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p" data-group-id="1325293134-1">}</span><span class="w">
</span><span class="n">elem</span><span class="p" data-group-id="1325293134-2">(</span><span class="n">tuple</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p" data-group-id="1325293134-2">)</span><span class="w">
</span><span class="c1">#=&gt; :bar</span><span class="w">

</span><span class="n">elem</span><span class="p" data-group-id="1325293134-3">(</span><span class="p" data-group-id="1325293134-4">{</span><span class="p" data-group-id="1325293134-4">}</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p" data-group-id="1325293134-3">)</span><span class="w">
</span><span class="c1">#=&gt; ** (ArgumentError) argument error</span><span class="w">

</span><span class="n">elem</span><span class="p" data-group-id="1325293134-5">(</span><span class="p" data-group-id="1325293134-6">{</span><span class="ss">:foo</span><span class="p">,</span><span class="w"> </span><span class="ss">:bar</span><span class="p" data-group-id="1325293134-6">}</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p" data-group-id="1325293134-5">)</span><span class="w">
</span><span class="c1">#=&gt; ** (ArgumentError) argument error</span></code></pre>
  </section>
</div>
<div class="detail" id="exit/1">
    <div class="detail-header">
    <a href="#exit/1" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">exit(reason)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L401" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>exit(<a href="typespecs.html#built-in-types">term</a>()) :: <a href="typespecs.html#built-in-types">no_return</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Stops the execution of the calling process with the given reason.</p>
<p>Since evaluating this function causes the process to terminate,
it has no return value.</p>
<p>Inlined by the compiler.</p>
<h2 id="exit/1-examples" class="section-heading">
  <a href="#exit/1-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<p>When a process reaches its end, by default it exits with
reason <code class="inline">:normal</code>. You can also call <a href="#exit/1"><code class="inline">exit/1</code></a> explicitly if you
want to terminate a process but not signal any failure:</p>
<pre><code class="nohighlight makeup elixir"><span class="n">exit</span><span class="p" data-group-id="4976748244-1">(</span><span class="ss">:normal</span><span class="p" data-group-id="4976748244-1">)</span></code></pre>
<p>In case something goes wrong, you can also use <a href="#exit/1"><code class="inline">exit/1</code></a> with
a different reason:</p>
<pre><code class="nohighlight makeup elixir"><span class="n">exit</span><span class="p" data-group-id="1797731468-1">(</span><span class="ss">:seems_bad</span><span class="p" data-group-id="1797731468-1">)</span></code></pre>
<p>If the exit reason is not <code class="inline">:normal</code>, all the processes linked to the process
that exited will crash (unless they are trapping exits).</p>
<h2 id="exit/1-otp-exits" class="section-heading">
  <a href="#exit/1-otp-exits" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  OTP exits
</h2>

<p>Exits are used by the OTP to determine if a process exited abnormally
or not. The following exits are considered “normal”:</p>
<ul>
<li><code class="inline">exit(:normal)</code>
</li>
<li><code class="inline">exit(:shutdown)</code>
</li>
<li><code class="inline">exit({:shutdown, term})</code>
</li>
</ul>
<p>Exiting with any other reason is considered abnormal and treated
as a crash. This means the default supervisor behaviour kicks in,
error reports are emitted, etc.</p>
<p>This behaviour is relied on in many different places. For example,
<code class="inline">ExUnit</code> uses <code class="inline">exit(:shutdown)</code> when exiting the test process to
signal linked processes, supervision trees and so on to politely
shutdown too.</p>
<h2 id="exit/1-cli-exits" class="section-heading">
  <a href="#exit/1-cli-exits" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  CLI exits
</h2>

<p>Building on top of the exit signals mentioned above, if the
process started by the command line exits with any of the three
reasons above, its exit is considered normal and the Operating
System process will exit with status 0.</p>
<p>It is, however, possible to customize the Operating System exit
signal by invoking:</p>
<pre><code class="nohighlight makeup elixir"><span class="n">exit</span><span class="p" data-group-id="7146913432-1">(</span><span class="p" data-group-id="7146913432-2">{</span><span class="ss">:shutdown</span><span class="p">,</span><span class="w"> </span><span class="n">integer</span><span class="p" data-group-id="7146913432-2">}</span><span class="p" data-group-id="7146913432-1">)</span></code></pre>
<p>This will cause the OS process to exit with the status given by
<code class="inline">integer</code> while signaling all linked Erlang processes to politely
shutdown.</p>
<p>Any other exit reason will cause the OS process to exit with
status <code class="inline">1</code> and linked Erlang processes to crash.</p>
  </section>
</div>
<div class="detail" id="function_exported?/3">
    <div class="detail-header">
    <a href="#function_exported?/3" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">function_exported?(module, function, arity)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L3245" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>function_exported?(<a href="typespecs.html#built-in-types">module</a>(), <a href="typespecs.html#basic-types">atom</a>(), <a href="typespecs.html#built-in-types">arity</a>()) :: <a href="typespecs.html#built-in-types">boolean</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Returns <code class="inline">true</code> if <code class="inline">module</code> is loaded and contains a
public <code class="inline">function</code> with the given <code class="inline">arity</code>, otherwise <code class="inline">false</code>.</p>
<p>Note that this function does not load the module in case
it is not loaded. Check <a href="Code.html#ensure_loaded/1"><code class="inline">Code.ensure_loaded/1</code></a> for more
information.</p>
<p>Inlined by the compiler.</p>
<h2 id="function_exported?/3-examples" class="section-heading">
  <a href="#function_exported?/3-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">function_exported?</span><span class="p" data-group-id="4281057842-1">(</span><span class="nc">Enum</span><span class="p">,</span><span class="w"> </span><span class="ss">:member</span><span class="sc">?,</span><span class="w"> </span><span class="mi">2</span><span class="p" data-group-id="4281057842-1">)</span><span class="w">
</span><span class="no">true</span></code></pre>
  </section>
</div>
<div class="detail" id="get_and_update_in/2">
    <div class="detail-header">
    <a href="#get_and_update_in/2" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">get_and_update_in(path, fun)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L2427" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Gets a value and updates a nested data structure via the given <code class="inline">path</code>.</p>
<p>This is similar to <a href="#get_and_update_in/3"><code class="inline">get_and_update_in/3</code></a>, except the path is extracted
via a macro rather than passing a list. For example:</p>
<pre><code class="nohighlight makeup elixir"><span class="n">get_and_update_in</span><span class="p" data-group-id="5896566622-1">(</span><span class="n">opts</span><span class="p" data-group-id="5896566622-2">[</span><span class="ss">:foo</span><span class="p" data-group-id="5896566622-2">]</span><span class="p" data-group-id="5896566622-3">[</span><span class="ss">:bar</span><span class="p" data-group-id="5896566622-3">]</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="p" data-group-id="5896566622-4">{</span><span class="ni">&amp;1</span><span class="p">,</span><span class="w"> </span><span class="ni">&amp;1</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p" data-group-id="5896566622-4">}</span><span class="p" data-group-id="5896566622-1">)</span></code></pre>
<p>Is equivalent to:</p>
<pre><code class="nohighlight makeup elixir"><span class="n">get_and_update_in</span><span class="p" data-group-id="3085529805-1">(</span><span class="n">opts</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="3085529805-2">[</span><span class="ss">:foo</span><span class="p">,</span><span class="w"> </span><span class="ss">:bar</span><span class="p" data-group-id="3085529805-2">]</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="p" data-group-id="3085529805-3">{</span><span class="ni">&amp;1</span><span class="p">,</span><span class="w"> </span><span class="ni">&amp;1</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p" data-group-id="3085529805-3">}</span><span class="p" data-group-id="3085529805-1">)</span></code></pre>
<p>Note that in order for this macro to work, the complete path must always
be visible by this macro. See the Paths section below.</p>
<h2 id="get_and_update_in/2-examples" class="section-heading">
  <a href="#get_and_update_in/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">users</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p" data-group-id="6942543288-1">%{</span><span class="s">&quot;john&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="6942543288-2">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">27</span><span class="p" data-group-id="6942543288-2">}</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;meg&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="6942543288-3">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">23</span><span class="p" data-group-id="6942543288-3">}</span><span class="p" data-group-id="6942543288-1">}</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="n">get_and_update_in</span><span class="p" data-group-id="6942543288-4">(</span><span class="n">users</span><span class="p" data-group-id="6942543288-5">[</span><span class="s">&quot;john&quot;</span><span class="p" data-group-id="6942543288-5">]</span><span class="o">.</span><span class="n">age</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="p" data-group-id="6942543288-6">{</span><span class="ni">&amp;1</span><span class="p">,</span><span class="w"> </span><span class="ni">&amp;1</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p" data-group-id="6942543288-6">}</span><span class="p" data-group-id="6942543288-4">)</span><span class="w">
</span><span class="p" data-group-id="6942543288-7">{</span><span class="mi">27</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="6942543288-8">%{</span><span class="s">&quot;john&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="6942543288-9">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">28</span><span class="p" data-group-id="6942543288-9">}</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;meg&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="6942543288-10">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">23</span><span class="p" data-group-id="6942543288-10">}</span><span class="p" data-group-id="6942543288-8">}</span><span class="p" data-group-id="6942543288-7">}</span></code></pre>
<h2 id="get_and_update_in/2-paths" class="section-heading">
  <a href="#get_and_update_in/2-paths" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Paths
</h2>

<p>A path may start with a variable, local or remote call, and must be
followed by one or more:</p>
<ul>
<li><p><code class="inline">foo[bar]</code> - accesses the key <code class="inline">bar</code> in <code class="inline">foo</code>; in case <code class="inline">foo</code> is nil,
<code class="inline">nil</code> is returned</p>
</li>
<li><p><code class="inline">foo.bar</code> - accesses a map/struct field; in case the field is not
present, an error is raised</p>
</li>
</ul>
<p>Here are some valid paths:</p>
<pre><code class="nohighlight makeup elixir"><span class="n">users</span><span class="p" data-group-id="5080847386-1">[</span><span class="s">&quot;john&quot;</span><span class="p" data-group-id="5080847386-1">]</span><span class="p" data-group-id="5080847386-2">[</span><span class="ss">:age</span><span class="p" data-group-id="5080847386-2">]</span><span class="w">
</span><span class="n">users</span><span class="p" data-group-id="5080847386-3">[</span><span class="s">&quot;john&quot;</span><span class="p" data-group-id="5080847386-3">]</span><span class="o">.</span><span class="n">age</span><span class="w">
</span><span class="nc">User</span><span class="o">.</span><span class="n">all</span><span class="p" data-group-id="5080847386-4">[</span><span class="s">&quot;john&quot;</span><span class="p" data-group-id="5080847386-4">]</span><span class="o">.</span><span class="n">age</span><span class="w">
</span><span class="n">all_users</span><span class="p" data-group-id="5080847386-5">(</span><span class="p" data-group-id="5080847386-5">)</span><span class="p" data-group-id="5080847386-6">[</span><span class="s">&quot;john&quot;</span><span class="p" data-group-id="5080847386-6">]</span><span class="o">.</span><span class="n">age</span></code></pre>
<p>Here are some invalid ones:</p>
<pre><code class="nohighlight makeup elixir"><span class="c1"># Does a remote call after the initial value</span><span class="w">
</span><span class="n">users</span><span class="p" data-group-id="1886137324-1">[</span><span class="s">&quot;john&quot;</span><span class="p" data-group-id="1886137324-1">]</span><span class="o">.</span><span class="n">do_something</span><span class="p" data-group-id="1886137324-2">(</span><span class="n">arg1</span><span class="p">,</span><span class="w"> </span><span class="n">arg2</span><span class="p" data-group-id="1886137324-2">)</span><span class="w">

</span><span class="c1"># Does not access any key or field</span><span class="w">
</span><span class="n">users</span></code></pre>
  </section>
</div>
<div class="detail" id="get_and_update_in/3">
    <div class="detail-header">
    <a href="#get_and_update_in/3" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">get_and_update_in(data, keys, fun)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L2219" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>get_and_update_in(
  structure :: <a href="Access.html#t:t/0">Access.t</a>(),
  keys,
  (<a href="typespecs.html#built-in-types">term</a>() -> {get_value, update_value} | :pop)
) :: {get_value, structure :: <a href="Access.html#t:t/0">Access.t</a>()}
when keys: [<a href="typespecs.html#basic-types">any</a>(), ...], update_value: <a href="typespecs.html#built-in-types">term</a>(), get_value: var</pre>
      </div>
  </div>
  <section class="docstring">
<p>Gets a value and updates a nested structure.</p>
<p><code class="inline">data</code> is a nested structure (that is, a map, keyword
list, or struct that implements the <a href="Access.html"><code class="inline">Access</code></a> behaviour).</p>
<p>The <code class="inline">fun</code> argument receives the value of <code class="inline">key</code> (or <code class="inline">nil</code> if <code class="inline">key</code>
is not present) and must return one of the following values:</p>
<ul>
<li><p>a two-element tuple <code class="inline">{get_value, new_value}</code>. In this case,
<code class="inline">get_value</code> is the retrieved value which can possibly be operated on before
being returned. <code class="inline">new_value</code> is the new value to be stored under <code class="inline">key</code>.</p>
</li>
<li><p><code class="inline">:pop</code>, which implies that the current value under <code class="inline">key</code>
should be removed from the structure and returned.</p>
</li>
</ul>
<p>This function uses the <a href="Access.html"><code class="inline">Access</code></a> module to traverse the structures
according to the given <code class="inline">keys</code>, unless the <code class="inline">key</code> is a
function.</p>
<p>If a key is a function, the function will be invoked
passing three arguments:</p>
<ul>
<li>the operation (<code class="inline">:get_and_update</code>)
</li>
<li>the data to be accessed
</li>
<li>a function to be invoked next
</li>
</ul>
<p>This means <a href="#get_and_update_in/3"><code class="inline">get_and_update_in/3</code></a> can be extended to provide
custom lookups. The downside is that functions cannot be stored
as keys in the accessed data structures.</p>
<h2 id="get_and_update_in/3-examples" class="section-heading">
  <a href="#get_and_update_in/3-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<p>This function is useful when there is a need to retrieve the current
value (or something calculated in function of the current value) and
update it at the same time. For example, it could be used to read the
current age of a user while increasing it by one in one pass:</p>
<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">users</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p" data-group-id="1296348245-1">%{</span><span class="s">&quot;john&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="1296348245-2">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">27</span><span class="p" data-group-id="1296348245-2">}</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;meg&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="1296348245-3">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">23</span><span class="p" data-group-id="1296348245-3">}</span><span class="p" data-group-id="1296348245-1">}</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="n">get_and_update_in</span><span class="p" data-group-id="1296348245-4">(</span><span class="n">users</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="1296348245-5">[</span><span class="s">&quot;john&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">:age</span><span class="p" data-group-id="1296348245-5">]</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="p" data-group-id="1296348245-6">{</span><span class="ni">&amp;1</span><span class="p">,</span><span class="w"> </span><span class="ni">&amp;1</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p" data-group-id="1296348245-6">}</span><span class="p" data-group-id="1296348245-4">)</span><span class="w">
</span><span class="p" data-group-id="1296348245-7">{</span><span class="mi">27</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="1296348245-8">%{</span><span class="s">&quot;john&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="1296348245-9">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">28</span><span class="p" data-group-id="1296348245-9">}</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;meg&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="1296348245-10">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">23</span><span class="p" data-group-id="1296348245-10">}</span><span class="p" data-group-id="1296348245-8">}</span><span class="p" data-group-id="1296348245-7">}</span></code></pre>
<p>When one of the keys is a function, the function is invoked.
In the example below, we use a function to get and increment all
ages inside a list:</p>
<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">users</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p" data-group-id="6755645184-1">[</span><span class="p" data-group-id="6755645184-2">%{</span><span class="ss">name</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;john&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">27</span><span class="p" data-group-id="6755645184-2">}</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="6755645184-3">%{</span><span class="ss">name</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;meg&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">23</span><span class="p" data-group-id="6755645184-3">}</span><span class="p" data-group-id="6755645184-1">]</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="n">all</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k" data-group-id="6755645184-4">fn</span><span class="w"> </span><span class="ss">:get_and_update</span><span class="p">,</span><span class="w"> </span><span class="n">data</span><span class="p">,</span><span class="w"> </span><span class="n">next</span><span class="w"> </span><span class="o">-&gt;</span><span class="w">
</span><span class="gp unselectable">...&gt; </span><span class="w">  </span><span class="n">data</span><span class="w"> </span><span class="o">|&gt;</span><span class="w"> </span><span class="nc">Enum</span><span class="o">.</span><span class="n">map</span><span class="p" data-group-id="6755645184-5">(</span><span class="n">next</span><span class="p" data-group-id="6755645184-5">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w"> </span><span class="nc">Enum</span><span class="o">.</span><span class="n">unzip</span><span class="p" data-group-id="6755645184-6">(</span><span class="p" data-group-id="6755645184-6">)</span><span class="w">
</span><span class="gp unselectable">...&gt; </span><span class="k" data-group-id="6755645184-4">end</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="n">get_and_update_in</span><span class="p" data-group-id="6755645184-7">(</span><span class="n">users</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="6755645184-8">[</span><span class="n">all</span><span class="p">,</span><span class="w"> </span><span class="ss">:age</span><span class="p" data-group-id="6755645184-8">]</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="p" data-group-id="6755645184-9">{</span><span class="ni">&amp;1</span><span class="p">,</span><span class="w"> </span><span class="ni">&amp;1</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p" data-group-id="6755645184-9">}</span><span class="p" data-group-id="6755645184-7">)</span><span class="w">
</span><span class="p" data-group-id="6755645184-10">{</span><span class="p" data-group-id="6755645184-11">[</span><span class="mi">27</span><span class="p">,</span><span class="w"> </span><span class="mi">23</span><span class="p" data-group-id="6755645184-11">]</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="6755645184-12">[</span><span class="p" data-group-id="6755645184-13">%{</span><span class="ss">name</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;john&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">28</span><span class="p" data-group-id="6755645184-13">}</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="6755645184-14">%{</span><span class="ss">name</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;meg&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">24</span><span class="p" data-group-id="6755645184-14">}</span><span class="p" data-group-id="6755645184-12">]</span><span class="p" data-group-id="6755645184-10">}</span></code></pre>
<p>If the previous value before invoking the function is <code class="inline">nil</code>,
the function <em>will</em> receive <code class="inline">nil</code> as a value and must handle it
accordingly (be it by failing or providing a sane default).</p>
<p>The <a href="Access.html"><code class="inline">Access</code></a> module ships with many convenience accessor functions,
like the <code class="inline">all</code> anonymous function defined above. See <a href="Access.html#all/0"><code class="inline">Access.all/0</code></a>,
<a href="Access.html#key/2"><code class="inline">Access.key/2</code></a>, and others as examples.</p>
  </section>
</div>
<div class="detail" id="get_in/2">
    <div class="detail-header">
    <a href="#get_in/2" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">get_in(data, keys)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L2093" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>get_in(<a href="Access.html#t:t/0">Access.t</a>(), [<a href="typespecs.html#built-in-types">term</a>(), ...]) :: <a href="typespecs.html#built-in-types">term</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Gets a value from a nested structure.</p>
<p>Uses the <a href="Access.html"><code class="inline">Access</code></a> module to traverse the structures
according to the given <code class="inline">keys</code>, unless the <code class="inline">key</code> is a
function.</p>
<p>If a key is a function, the function will be invoked
passing three arguments:</p>
<ul>
<li>the operation (<code class="inline">:get</code>)
</li>
<li>the data to be accessed
</li>
<li>a function to be invoked next
</li>
</ul>
<p>This means <a href="#get_in/2"><code class="inline">get_in/2</code></a> can be extended to provide
custom lookups. The downside is that functions cannot be
stored as keys in the accessed data structures.</p>
<h2 id="get_in/2-examples" class="section-heading">
  <a href="#get_in/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">users</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p" data-group-id="7743495256-1">%{</span><span class="s">&quot;john&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="7743495256-2">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">27</span><span class="p" data-group-id="7743495256-2">}</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;meg&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="7743495256-3">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">23</span><span class="p" data-group-id="7743495256-3">}</span><span class="p" data-group-id="7743495256-1">}</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="n">get_in</span><span class="p" data-group-id="7743495256-4">(</span><span class="n">users</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="7743495256-5">[</span><span class="s">&quot;john&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">:age</span><span class="p" data-group-id="7743495256-5">]</span><span class="p" data-group-id="7743495256-4">)</span><span class="w">
</span><span class="mi">27</span></code></pre>
<p>In case any of the entries in the middle returns <code class="inline">nil</code>, <code class="inline">nil</code> will
be returned as per the <a href="Access.html"><code class="inline">Access</code></a> module:</p>
<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">users</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p" data-group-id="2017153344-1">%{</span><span class="s">&quot;john&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="2017153344-2">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">27</span><span class="p" data-group-id="2017153344-2">}</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;meg&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="2017153344-3">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">23</span><span class="p" data-group-id="2017153344-3">}</span><span class="p" data-group-id="2017153344-1">}</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="n">get_in</span><span class="p" data-group-id="2017153344-4">(</span><span class="n">users</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="2017153344-5">[</span><span class="s">&quot;unknown&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">:age</span><span class="p" data-group-id="2017153344-5">]</span><span class="p" data-group-id="2017153344-4">)</span><span class="w">
</span><span class="no">nil</span></code></pre>
<p>When one of the keys is a function that takes three arguments, the function
is invoked. In the example below, we use a function to get all the maps
inside a list:</p>
<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">users</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p" data-group-id="8212085108-1">[</span><span class="p" data-group-id="8212085108-2">%{</span><span class="ss">name</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;john&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">27</span><span class="p" data-group-id="8212085108-2">}</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="8212085108-3">%{</span><span class="ss">name</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;meg&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">23</span><span class="p" data-group-id="8212085108-3">}</span><span class="p" data-group-id="8212085108-1">]</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="n">all</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k" data-group-id="8212085108-4">fn</span><span class="w"> </span><span class="ss">:get</span><span class="p">,</span><span class="w"> </span><span class="n">data</span><span class="p">,</span><span class="w"> </span><span class="n">next</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="nc">Enum</span><span class="o">.</span><span class="n">map</span><span class="p" data-group-id="8212085108-5">(</span><span class="n">data</span><span class="p">,</span><span class="w"> </span><span class="n">next</span><span class="p" data-group-id="8212085108-5">)</span><span class="w"> </span><span class="k" data-group-id="8212085108-4">end</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="n">get_in</span><span class="p" data-group-id="8212085108-6">(</span><span class="n">users</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="8212085108-7">[</span><span class="n">all</span><span class="p">,</span><span class="w"> </span><span class="ss">:age</span><span class="p" data-group-id="8212085108-7">]</span><span class="p" data-group-id="8212085108-6">)</span><span class="w">
</span><span class="p" data-group-id="8212085108-8">[</span><span class="mi">27</span><span class="p">,</span><span class="w"> </span><span class="mi">23</span><span class="p" data-group-id="8212085108-8">]</span></code></pre>
<p>If the previous value before invoking the function is <code class="inline">nil</code>,
the function <em>will</em> receive <code class="inline">nil</code> as a value and must handle it
accordingly.</p>
  </section>
</div>
<div class="detail" id="hd/1">
    <div class="detail-header">
    <a href="#hd/1" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">hd(list)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L425" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>hd(nonempty_maybe_improper_list(elem, <a href="typespecs.html#basic-types">any</a>())) :: elem when elem: <a href="typespecs.html#built-in-types">term</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Returns the head of a list. Raises <a href="ArgumentError.html"><code class="inline">ArgumentError</code></a> if the list is empty.</p>
<p>It works with improper lists.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
<h2 id="hd/1-examples" class="section-heading">
  <a href="#hd/1-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="n">hd</span><span class="p" data-group-id="8922889351-1">(</span><span class="p" data-group-id="8922889351-2">[</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="mi">4</span><span class="p" data-group-id="8922889351-2">]</span><span class="p" data-group-id="8922889351-1">)</span><span class="w">
</span><span class="c1">#=&gt; 1</span><span class="w">

</span><span class="n">hd</span><span class="p" data-group-id="8922889351-3">(</span><span class="p" data-group-id="8922889351-4">[</span><span class="p" data-group-id="8922889351-4">]</span><span class="p" data-group-id="8922889351-3">)</span><span class="w">
</span><span class="c1">#=&gt; ** (ArgumentError) argument error</span><span class="w">

</span><span class="n">hd</span><span class="p" data-group-id="8922889351-5">(</span><span class="p" data-group-id="8922889351-6">[</span><span class="mi">1</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mi">2</span><span class="p" data-group-id="8922889351-6">]</span><span class="p" data-group-id="8922889351-5">)</span><span class="w">
</span><span class="c1">#=&gt; 1</span></code></pre>
  </section>
</div>
<div class="detail" id="if/2">
    <div class="detail-header">
    <a href="#if/2" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">if(condition, clauses)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L2900" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Provides an <a href="#if/2"><code class="inline">if/2</code></a> macro.</p>
<p>This macro expects the first argument to be a condition and the second
argument to be a keyword list.</p>
<h2 id="if/2-one-liner-examples" class="section-heading">
  <a href="#if/2-one-liner-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  One-liner examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="k">if</span><span class="p" data-group-id="2462339106-1">(</span><span class="n">foo</span><span class="p">,</span><span class="w"> </span><span class="ss">do</span><span class="p">:</span><span class="w"> </span><span class="n">bar</span><span class="p" data-group-id="2462339106-1">)</span></code></pre>
<p>In the example above, <code class="inline">bar</code> will be returned if <code class="inline">foo</code> evaluates to
<code class="inline">true</code> (i.e., it is neither <code class="inline">false</code> nor <code class="inline">nil</code>). Otherwise, <code class="inline">nil</code> will be
returned.</p>
<p>An <code class="inline">else</code> option can be given to specify the opposite:</p>
<pre><code class="nohighlight makeup elixir"><span class="k">if</span><span class="p" data-group-id="1589883001-1">(</span><span class="n">foo</span><span class="p">,</span><span class="w"> </span><span class="ss">do</span><span class="p">:</span><span class="w"> </span><span class="n">bar</span><span class="p">,</span><span class="w"> </span><span class="ss">else</span><span class="p">:</span><span class="w"> </span><span class="n">baz</span><span class="p" data-group-id="1589883001-1">)</span></code></pre>
<h2 id="if/2-blocks-examples" class="section-heading">
  <a href="#if/2-blocks-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Blocks examples
</h2>

<p>It’s also possible to pass a block to the <a href="#if/2"><code class="inline">if/2</code></a> macro. The first
example above would be translated to:</p>
<pre><code class="nohighlight makeup elixir"><span class="k">if</span><span class="w"> </span><span class="n">foo</span><span class="w"> </span><span class="k" data-group-id="8776421154-1">do</span><span class="w">
  </span><span class="n">bar</span><span class="w">
</span><span class="k" data-group-id="8776421154-1">end</span></code></pre>
<p>Note that <code class="inline">do/end</code> become delimiters. The second example would
translate to:</p>
<pre><code class="nohighlight makeup elixir"><span class="k">if</span><span class="w"> </span><span class="n">foo</span><span class="w"> </span><span class="k" data-group-id="8795362667-1">do</span><span class="w">
  </span><span class="n">bar</span><span class="w">
</span><span class="k" data-group-id="8795362667-1">else</span><span class="w">
  </span><span class="n">baz</span><span class="w">
</span><span class="k" data-group-id="8795362667-1">end</span></code></pre>
<p>In order to compare more than two clauses, the <a href="Kernel.SpecialForms.html#cond/1"><code class="inline">cond/1</code></a> macro has to be used.</p>
  </section>
</div>
<div class="detail" id="in/2">
    <div class="detail-header">
    <a href="#in/2" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">left in right</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L3332" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Checks if the element on the left-hand side is a member of the
collection on the right-hand side.</p>
<h2 id="in/2-examples" class="section-heading">
  <a href="#in/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="n">x</span><span class="w"> </span><span class="ow">in</span><span class="w"> </span><span class="p" data-group-id="2885387911-1">[</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p" data-group-id="2885387911-1">]</span><span class="w">
</span><span class="no">true</span></code></pre>
<p>This operator (which is a macro) simply translates to a call to
<a href="Enum.html#member?/2"><code class="inline">Enum.member?/2</code></a>. The example above would translate to:</p>
<pre><code class="nohighlight makeup elixir"><span class="nc">Enum</span><span class="o">.</span><span class="n">member?</span><span class="p" data-group-id="3947674240-1">(</span><span class="p" data-group-id="3947674240-2">[</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p" data-group-id="3947674240-2">]</span><span class="p">,</span><span class="w"> </span><span class="n">x</span><span class="p" data-group-id="3947674240-1">)</span></code></pre>
<p>Elixir also supports <code class="inline">left not in right</code>, which evaluates to
<code class="inline">not(left in right)</code>:</p>
<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="n">x</span><span class="w"> </span><span class="ow">not</span><span class="w"> </span><span class="ow">in</span><span class="w"> </span><span class="p" data-group-id="2133348837-1">[</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p" data-group-id="2133348837-1">]</span><span class="w">
</span><span class="no">false</span></code></pre>
<h2 id="in/2-guards" class="section-heading">
  <a href="#in/2-guards" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Guards
</h2>

<p>The <a href="#in/2"><code class="inline">in/2</code></a> operator (as well as <code class="inline">not in</code>) can be used in guard clauses as
long as the right-hand side is a range or a list. In such cases, Elixir will
expand the operator to a valid guard expression. For example:</p>
<pre><code class="nohighlight makeup elixir"><span class="ow">when</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="ow">in</span><span class="w"> </span><span class="p" data-group-id="5830717164-1">[</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p" data-group-id="5830717164-1">]</span></code></pre>
<p>translates to:</p>
<pre><code class="nohighlight makeup elixir"><span class="ow">when</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">===</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="ow">or</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">===</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="ow">or</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">===</span><span class="w"> </span><span class="mi">3</span></code></pre>
<p>When using ranges:</p>
<pre><code class="nohighlight makeup elixir"><span class="ow">when</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="ow">in</span><span class="w"> </span><span class="mi">1</span><span class="o">.</span><span class="o">.</span><span class="mi">3</span></code></pre>
<p>translates to:</p>
<pre><code class="nohighlight makeup elixir"><span class="ow">when</span><span class="w"> </span><span class="n">is_integer</span><span class="p" data-group-id="7347431626-1">(</span><span class="n">x</span><span class="p" data-group-id="7347431626-1">)</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">&lt;=</span><span class="w"> </span><span class="mi">3</span></code></pre>
<p>Note that only integers can be considered inside a range by <code class="inline">in</code>.</p>
<h3 id="in/2-ast-considerations" class="section-heading">
  <a href="#in/2-ast-considerations" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  AST considerations
</h3>

<p><code class="inline">left not in right</code> is parsed by the compiler into the AST:</p>
<pre><code class="nohighlight makeup elixir"><span class="p" data-group-id="5112748144-1">{</span><span class="ss">:not</span><span class="p">,</span><span class="w"> </span><span class="bp">_</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="5112748144-2">[</span><span class="p" data-group-id="5112748144-3">{</span><span class="ss">:in</span><span class="p">,</span><span class="w"> </span><span class="bp">_</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="5112748144-4">[</span><span class="n">left</span><span class="p">,</span><span class="w"> </span><span class="n">right</span><span class="p" data-group-id="5112748144-4">]</span><span class="p" data-group-id="5112748144-3">}</span><span class="p" data-group-id="5112748144-2">]</span><span class="p" data-group-id="5112748144-1">}</span></code></pre>
<p>This is the same AST as <code class="inline">not(left in right)</code>.</p>
<p>Additionally, <a href="Macro.html#to_string/2"><code class="inline">Macro.to_string/2</code></a> will translate all occurrences of
this AST to <code class="inline">left not in right</code>.</p>
  </section>
</div>
<div class="detail" id="inspect/2">
  
    <span id="inspect/1"></span>
  <div class="detail-header">
    <a href="#inspect/2" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">inspect(term, opts \\ [])</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L1920" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>inspect(<a href="Inspect.html#t:t/0">Inspect.t</a>(), <a href="typespecs.html#built-in-types">keyword</a>()) :: <a href="String.html#t:t/0">String.t</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Inspects the given argument according to the <a href="Inspect.html"><code class="inline">Inspect</code></a> protocol.
The second argument is a keyword list with options to control
inspection.</p>
<h2 id="inspect/2-options" class="section-heading">
  <a href="#inspect/2-options" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Options
</h2>

<p><a href="#inspect/2"><code class="inline">inspect/2</code></a> accepts a list of options that are internally
translated to an <a href="Inspect.Opts.html"><code class="inline">Inspect.Opts</code></a> struct. Check the docs for
<a href="Inspect.Opts.html"><code class="inline">Inspect.Opts</code></a> to see the supported options.</p>
<h2 id="inspect/2-examples" class="section-heading">
  <a href="#inspect/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">inspect</span><span class="p" data-group-id="4611526932-1">(</span><span class="ss">:foo</span><span class="p" data-group-id="4611526932-1">)</span><span class="w">
</span><span class="s">&quot;:foo&quot;</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="n">inspect</span><span class="p" data-group-id="4611526932-2">(</span><span class="p" data-group-id="4611526932-3">[</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="p" data-group-id="4611526932-3">]</span><span class="p">,</span><span class="w"> </span><span class="ss">limit</span><span class="p">:</span><span class="w"> </span><span class="mi">3</span><span class="p" data-group-id="4611526932-2">)</span><span class="w">
</span><span class="s">&quot;[1, 2, 3, ...]&quot;</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="n">inspect</span><span class="p" data-group-id="4611526932-4">(</span><span class="p" data-group-id="4611526932-5">[</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p" data-group-id="4611526932-5">]</span><span class="p">,</span><span class="w"> </span><span class="ss">pretty</span><span class="p">:</span><span class="w"> </span><span class="no">true</span><span class="p">,</span><span class="w"> </span><span class="ss">width</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p" data-group-id="4611526932-4">)</span><span class="w">
</span><span class="s">&quot;[1,</span><span class="se">\n</span><span class="s"> 2,</span><span class="se">\n</span><span class="s"> 3]&quot;</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="n">inspect</span><span class="p" data-group-id="4611526932-6">(</span><span class="s">&quot;olá&quot;</span><span class="w"> </span><span class="o">&lt;&gt;</span><span class="w"> </span><span class="p" data-group-id="4611526932-7">&lt;&lt;</span><span class="mi">0</span><span class="p" data-group-id="4611526932-7">&gt;&gt;</span><span class="p" data-group-id="4611526932-6">)</span><span class="w">
</span><span class="s">&quot;&lt;&lt;111, 108, 195, 161, 0&gt;&gt;&quot;</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="n">inspect</span><span class="p" data-group-id="4611526932-8">(</span><span class="s">&quot;olá&quot;</span><span class="w"> </span><span class="o">&lt;&gt;</span><span class="w"> </span><span class="p" data-group-id="4611526932-9">&lt;&lt;</span><span class="mi">0</span><span class="p" data-group-id="4611526932-9">&gt;&gt;</span><span class="p">,</span><span class="w"> </span><span class="ss">binaries</span><span class="p">:</span><span class="w"> </span><span class="ss">:as_strings</span><span class="p" data-group-id="4611526932-8">)</span><span class="w">
</span><span class="s">&quot;</span><span class="se">\&quot;</span><span class="s">olá</span><span class="se">\\</span><span class="s">0</span><span class="se">\&quot;</span><span class="s">&quot;</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="n">inspect</span><span class="p" data-group-id="4611526932-10">(</span><span class="s">&quot;olá&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">binaries</span><span class="p">:</span><span class="w"> </span><span class="ss">:as_binaries</span><span class="p" data-group-id="4611526932-10">)</span><span class="w">
</span><span class="s">&quot;&lt;&lt;111, 108, 195, 161&gt;&gt;&quot;</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="n">inspect</span><span class="p" data-group-id="4611526932-11">(</span><span class="sc">&#39;bar&#39;</span><span class="p" data-group-id="4611526932-11">)</span><span class="w">
</span><span class="s">&quot;&#39;bar&#39;&quot;</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="n">inspect</span><span class="p" data-group-id="4611526932-12">(</span><span class="p" data-group-id="4611526932-13">[</span><span class="mi">0</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="sc">&#39;bar&#39;</span><span class="p" data-group-id="4611526932-13">]</span><span class="p" data-group-id="4611526932-12">)</span><span class="w">
</span><span class="s">&quot;[0, 98, 97, 114]&quot;</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="n">inspect</span><span class="p" data-group-id="4611526932-14">(</span><span class="mi">100</span><span class="p">,</span><span class="w"> </span><span class="ss">base</span><span class="p">:</span><span class="w"> </span><span class="ss">:octal</span><span class="p" data-group-id="4611526932-14">)</span><span class="w">
</span><span class="s">&quot;0o144&quot;</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="n">inspect</span><span class="p" data-group-id="4611526932-15">(</span><span class="mi">100</span><span class="p">,</span><span class="w"> </span><span class="ss">base</span><span class="p">:</span><span class="w"> </span><span class="ss">:hex</span><span class="p" data-group-id="4611526932-15">)</span><span class="w">
</span><span class="s">&quot;0x64&quot;</span></code></pre>
<p>Note that the <a href="Inspect.html"><code class="inline">Inspect</code></a> protocol does not necessarily return a valid
representation of an Elixir term. In such cases, the inspected result
must start with <code class="inline">#</code>. For example, inspecting a function will return:</p>
<pre><code class="nohighlight makeup elixir"><span class="n">inspect</span><span class="w"> </span><span class="k" data-group-id="0323358644-1">fn</span><span class="w"> </span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="k" data-group-id="0323358644-1">end</span><span class="w">
</span><span class="c1">#=&gt; #Function&lt;...&gt;</span></code></pre>
  </section>
</div>
<div class="detail" id="is_atom/1">
    <div class="detail-header">
    <a href="#is_atom/1" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">is_atom(term)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L435" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>is_atom(<a href="typespecs.html#built-in-types">term</a>()) :: <a href="typespecs.html#built-in-types">boolean</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Returns <code class="inline">true</code> if <code class="inline">term</code> is an atom; otherwise returns <code class="inline">false</code>.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
  </section>
</div>
<div class="detail" id="is_binary/1">
    <div class="detail-header">
    <a href="#is_binary/1" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">is_binary(term)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L455" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>is_binary(<a href="typespecs.html#built-in-types">term</a>()) :: <a href="typespecs.html#built-in-types">boolean</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Returns <code class="inline">true</code> if <code class="inline">term</code> is a binary; otherwise returns <code class="inline">false</code>.</p>
<p>A binary always contains a complete number of bytes.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
<h2 id="is_binary/1-examples" class="section-heading">
  <a href="#is_binary/1-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">is_binary</span><span class="p" data-group-id="6301241981-1">(</span><span class="s">&quot;foo&quot;</span><span class="p" data-group-id="6301241981-1">)</span><span class="w">
</span><span class="no">true</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="n">is_binary</span><span class="p" data-group-id="6301241981-2">(</span><span class="p" data-group-id="6301241981-3">&lt;&lt;</span><span class="mi">1</span><span class="o">::</span><span class="mi">3</span><span class="p" data-group-id="6301241981-3">&gt;&gt;</span><span class="p" data-group-id="6301241981-2">)</span><span class="w">
</span><span class="no">false</span></code></pre>
  </section>
</div>
<div class="detail" id="is_bitstring/1">
    <div class="detail-header">
    <a href="#is_bitstring/1" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">is_bitstring(term)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L473" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>is_bitstring(<a href="typespecs.html#built-in-types">term</a>()) :: <a href="typespecs.html#built-in-types">boolean</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Returns <code class="inline">true</code> if <code class="inline">term</code> is a bitstring (including a binary); otherwise returns <code class="inline">false</code>.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
<h2 id="is_bitstring/1-examples" class="section-heading">
  <a href="#is_bitstring/1-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">is_bitstring</span><span class="p" data-group-id="3206435777-1">(</span><span class="s">&quot;foo&quot;</span><span class="p" data-group-id="3206435777-1">)</span><span class="w">
</span><span class="no">true</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="n">is_bitstring</span><span class="p" data-group-id="3206435777-2">(</span><span class="p" data-group-id="3206435777-3">&lt;&lt;</span><span class="mi">1</span><span class="o">::</span><span class="mi">3</span><span class="p" data-group-id="3206435777-3">&gt;&gt;</span><span class="p" data-group-id="3206435777-2">)</span><span class="w">
</span><span class="no">true</span></code></pre>
  </section>
</div>
<div class="detail" id="is_boolean/1">
    <div class="detail-header">
    <a href="#is_boolean/1" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">is_boolean(term)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L484" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>is_boolean(<a href="typespecs.html#built-in-types">term</a>()) :: <a href="typespecs.html#built-in-types">boolean</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Returns <code class="inline">true</code> if <code class="inline">term</code> is either the atom <code class="inline">true</code> or the atom <code class="inline">false</code> (i.e.,
a boolean); otherwise returns <code class="inline">false</code>.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
  </section>
</div>
<div class="detail" id="is_float/1">
    <div class="detail-header">
    <a href="#is_float/1" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">is_float(term)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L494" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>is_float(<a href="typespecs.html#built-in-types">term</a>()) :: <a href="typespecs.html#built-in-types">boolean</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Returns <code class="inline">true</code> if <code class="inline">term</code> is a floating-point number; otherwise returns <code class="inline">false</code>.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
  </section>
</div>
<div class="detail" id="is_function/1">
    <div class="detail-header">
    <a href="#is_function/1" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">is_function(term)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L504" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>is_function(<a href="typespecs.html#built-in-types">term</a>()) :: <a href="typespecs.html#built-in-types">boolean</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Returns <code class="inline">true</code> if <code class="inline">term</code> is a function; otherwise returns <code class="inline">false</code>.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
  </section>
</div>
<div class="detail" id="is_function/2">
    <div class="detail-header">
    <a href="#is_function/2" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">is_function(term, arity)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L523" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>is_function(<a href="typespecs.html#built-in-types">term</a>(), <a href="typespecs.html#basic-types">non_neg_integer</a>()) :: <a href="typespecs.html#built-in-types">boolean</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Returns <code class="inline">true</code> if <code class="inline">term</code> is a function that can be applied with <code class="inline">arity</code> number of arguments;
otherwise returns <code class="inline">false</code>.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
<h2 id="is_function/2-examples" class="section-heading">
  <a href="#is_function/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">is_function</span><span class="p" data-group-id="0335444823-1">(</span><span class="k" data-group-id="0335444823-2">fn</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="k" data-group-id="0335444823-2">end</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p" data-group-id="0335444823-1">)</span><span class="w">
</span><span class="no">true</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="n">is_function</span><span class="p" data-group-id="0335444823-3">(</span><span class="k" data-group-id="0335444823-4">fn</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="k" data-group-id="0335444823-4">end</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p" data-group-id="0335444823-3">)</span><span class="w">
</span><span class="no">false</span></code></pre>
  </section>
</div>
<div class="detail" id="is_integer/1">
    <div class="detail-header">
    <a href="#is_integer/1" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">is_integer(term)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L533" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>is_integer(<a href="typespecs.html#built-in-types">term</a>()) :: <a href="typespecs.html#built-in-types">boolean</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Returns <code class="inline">true</code> if <code class="inline">term</code> is an integer; otherwise returns <code class="inline">false</code>.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
  </section>
</div>
<div class="detail" id="is_list/1">
    <div class="detail-header">
    <a href="#is_list/1" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">is_list(term)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L543" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>is_list(<a href="typespecs.html#built-in-types">term</a>()) :: <a href="typespecs.html#built-in-types">boolean</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Returns <code class="inline">true</code> if <code class="inline">term</code> is a list with zero or more elements; otherwise returns <code class="inline">false</code>.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
  </section>
</div>
<div class="detail" id="is_map/1">
    <div class="detail-header">
    <a href="#is_map/1" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">is_map(term)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L604" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>is_map(<a href="typespecs.html#built-in-types">term</a>()) :: <a href="typespecs.html#built-in-types">boolean</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Returns <code class="inline">true</code> if <code class="inline">term</code> is a map; otherwise returns <code class="inline">false</code>.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
  </section>
</div>
<div class="detail" id="is_nil/1">
    <div class="detail-header">
    <a href="#is_nil/1" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">is_nil(term)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L2591" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Returns <code class="inline">true</code> if <code class="inline">term</code> is <code class="inline">nil</code>, <code class="inline">false</code> otherwise.</p>
<p>Allowed in guard clauses.</p>
<h2 id="is_nil/1-examples" class="section-heading">
  <a href="#is_nil/1-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">is_nil</span><span class="p" data-group-id="6560940853-1">(</span><span class="mi">1</span><span class="p" data-group-id="6560940853-1">)</span><span class="w">
</span><span class="no">false</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="n">is_nil</span><span class="p" data-group-id="6560940853-2">(</span><span class="no">nil</span><span class="p" data-group-id="6560940853-2">)</span><span class="w">
</span><span class="no">true</span></code></pre>
  </section>
</div>
<div class="detail" id="is_number/1">
    <div class="detail-header">
    <a href="#is_number/1" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">is_number(term)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L554" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>is_number(<a href="typespecs.html#built-in-types">term</a>()) :: <a href="typespecs.html#built-in-types">boolean</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Returns <code class="inline">true</code> if <code class="inline">term</code> is either an integer or a floating-point number;
otherwise returns <code class="inline">false</code>.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
  </section>
</div>
<div class="detail" id="is_pid/1">
    <div class="detail-header">
    <a href="#is_pid/1" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">is_pid(term)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L564" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>is_pid(<a href="typespecs.html#built-in-types">term</a>()) :: <a href="typespecs.html#built-in-types">boolean</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Returns <code class="inline">true</code> if <code class="inline">term</code> is a PID (process identifier); otherwise returns <code class="inline">false</code>.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
  </section>
</div>
<div class="detail" id="is_port/1">
    <div class="detail-header">
    <a href="#is_port/1" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">is_port(term)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L574" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>is_port(<a href="typespecs.html#built-in-types">term</a>()) :: <a href="typespecs.html#built-in-types">boolean</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Returns <code class="inline">true</code> if <code class="inline">term</code> is a port identifier; otherwise returns <code class="inline">false</code>.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
  </section>
</div>
<div class="detail" id="is_reference/1">
    <div class="detail-header">
    <a href="#is_reference/1" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">is_reference(term)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L584" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>is_reference(<a href="typespecs.html#built-in-types">term</a>()) :: <a href="typespecs.html#built-in-types">boolean</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Returns <code class="inline">true</code> if <code class="inline">term</code> is a reference; otherwise returns <code class="inline">false</code>.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
  </section>
</div>
<div class="detail" id="is_tuple/1">
    <div class="detail-header">
    <a href="#is_tuple/1" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">is_tuple(term)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L594" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>is_tuple(<a href="typespecs.html#built-in-types">term</a>()) :: <a href="typespecs.html#built-in-types">boolean</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Returns <code class="inline">true</code> if <code class="inline">term</code> is a tuple; otherwise returns <code class="inline">false</code>.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
  </section>
</div>
<div class="detail" id="length/1">
    <div class="detail-header">
    <a href="#length/1" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">length(list)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L620" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>length(<a href="typespecs.html#built-in-types">list</a>()) :: <a href="typespecs.html#basic-types">non_neg_integer</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Returns the length of <code class="inline">list</code>.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
<h2 id="length/1-examples" class="section-heading">
  <a href="#length/1-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">length</span><span class="p" data-group-id="9858789476-1">(</span><span class="p" data-group-id="9858789476-2">[</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="p">,</span><span class="w"> </span><span class="mi">6</span><span class="p">,</span><span class="w"> </span><span class="mi">7</span><span class="p">,</span><span class="w"> </span><span class="mi">8</span><span class="p">,</span><span class="w"> </span><span class="mi">9</span><span class="p" data-group-id="9858789476-2">]</span><span class="p" data-group-id="9858789476-1">)</span><span class="w">
</span><span class="mi">9</span></code></pre>
  </section>
</div>
<div class="detail" id="macro_exported?/3">
    <div class="detail-header">
    <a href="#macro_exported?/3" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">macro_exported?(module, macro, arity)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L3270" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>macro_exported?(<a href="typespecs.html#built-in-types">module</a>(), <a href="typespecs.html#basic-types">atom</a>(), <a href="typespecs.html#built-in-types">arity</a>()) :: <a href="typespecs.html#built-in-types">boolean</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Returns <code class="inline">true</code> if <code class="inline">module</code> is loaded and contains a
public <code class="inline">macro</code> with the given <code class="inline">arity</code>, otherwise <code class="inline">false</code>.</p>
<p>Note that this function does not load the module in case
it is not loaded. Check <a href="Code.html#ensure_loaded/1"><code class="inline">Code.ensure_loaded/1</code></a> for more
information.</p>
<p>If <code class="inline">module</code> is an Erlang module (as opposed to an Elixir module), this
function always returns <code class="inline">false</code>.</p>
<h2 id="macro_exported?/3-examples" class="section-heading">
  <a href="#macro_exported?/3-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">macro_exported?</span><span class="p" data-group-id="6066578821-1">(</span><span class="nc">Kernel</span><span class="p">,</span><span class="w"> </span><span class="ss">:use</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p" data-group-id="6066578821-1">)</span><span class="w">
</span><span class="no">true</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="n">macro_exported?</span><span class="p" data-group-id="6066578821-2">(</span><span class="ss">:erlang</span><span class="p">,</span><span class="w"> </span><span class="ss">:abs</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p" data-group-id="6066578821-2">)</span><span class="w">
</span><span class="no">false</span></code></pre>
  </section>
</div>
<div class="detail" id="make_ref/0">
    <div class="detail-header">
    <a href="#make_ref/0" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">make_ref()</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L638" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>make_ref() :: <a href="typespecs.html#basic-types">reference</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Returns an almost unique reference.</p>
<p>The returned reference will re-occur after approximately 2^82 calls;
therefore it is unique enough for practical purposes.</p>
<p>Inlined by the compiler.</p>
<h2 id="make_ref/0-examples" class="section-heading">
  <a href="#make_ref/0-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="n">make_ref</span><span class="p" data-group-id="8862381112-1">(</span><span class="p" data-group-id="8862381112-1">)</span><span class="w"> </span><span class="c1">#=&gt; #Reference&lt;0.0.0.135&gt;</span></code></pre>
  </section>
</div>
<div class="detail" id="map_size/1">
    <div class="detail-header">
    <a href="#map_size/1" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">map_size(map)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L658" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>map_size(<a href="typespecs.html#basic-types">map</a>()) :: <a href="typespecs.html#basic-types">non_neg_integer</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Returns the size of a map.</p>
<p>The size of a map is the number of key-value pairs that the map contains.</p>
<p>This operation happens in constant time.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
<h2 id="map_size/1-examples" class="section-heading">
  <a href="#map_size/1-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">map_size</span><span class="p" data-group-id="1243929541-1">(</span><span class="p" data-group-id="1243929541-2">%{</span><span class="ss">a</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;foo&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">b</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;bar&quot;</span><span class="p" data-group-id="1243929541-2">}</span><span class="p" data-group-id="1243929541-1">)</span><span class="w">
</span><span class="mi">2</span></code></pre>
  </section>
</div>
<div class="detail" id="match?/2">
    <div class="detail-header">
    <a href="#match?/2" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">match?(pattern, expr)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L2640" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>A convenience macro that checks if the right side (an expression) matches the
left side (a pattern).</p>
<h2 id="match?/2-examples" class="section-heading">
  <a href="#match?/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">match?</span><span class="p" data-group-id="4278560314-1">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p" data-group-id="4278560314-1">)</span><span class="w">
</span><span class="no">true</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="n">match?</span><span class="p" data-group-id="4278560314-2">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p" data-group-id="4278560314-2">)</span><span class="w">
</span><span class="no">false</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="n">match?</span><span class="p" data-group-id="4278560314-3">(</span><span class="p" data-group-id="4278560314-4">{</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="bp">_</span><span class="p" data-group-id="4278560314-4">}</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="4278560314-5">{</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p" data-group-id="4278560314-5">}</span><span class="p" data-group-id="4278560314-3">)</span><span class="w">
</span><span class="no">true</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="n">map</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p" data-group-id="4278560314-6">%{</span><span class="ss">a</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="ss">b</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p" data-group-id="4278560314-6">}</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="n">match?</span><span class="p" data-group-id="4278560314-7">(</span><span class="p" data-group-id="4278560314-8">%{</span><span class="ss">a</span><span class="p">:</span><span class="w"> </span><span class="bp">_</span><span class="p" data-group-id="4278560314-8">}</span><span class="p">,</span><span class="w"> </span><span class="n">map</span><span class="p" data-group-id="4278560314-7">)</span><span class="w">
</span><span class="no">true</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="n">a</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="n">match?</span><span class="p" data-group-id="4278560314-9">(</span><span class="o">^</span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p" data-group-id="4278560314-9">)</span><span class="w">
</span><span class="no">true</span></code></pre>
<p><a href="#match?/2"><code class="inline">match?/2</code></a> is very useful when filtering of finding a value in an enumerable:</p>
<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">list</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p" data-group-id="2926354779-1">[</span><span class="ss">a</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="ss">b</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="ss">a</span><span class="p">:</span><span class="w"> </span><span class="mi">3</span><span class="p" data-group-id="2926354779-1">]</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="nc">Enum</span><span class="o">.</span><span class="n">filter</span><span class="p" data-group-id="2926354779-2">(</span><span class="n">list</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">match?</span><span class="p" data-group-id="2926354779-3">(</span><span class="p" data-group-id="2926354779-4">{</span><span class="ss">:a</span><span class="p">,</span><span class="w"> </span><span class="bp">_</span><span class="p" data-group-id="2926354779-4">}</span><span class="p">,</span><span class="w"> </span><span class="ni">&amp;1</span><span class="p" data-group-id="2926354779-3">)</span><span class="p" data-group-id="2926354779-2">)</span><span class="w">
</span><span class="p" data-group-id="2926354779-5">[</span><span class="ss">a</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="ss">a</span><span class="p">:</span><span class="w"> </span><span class="mi">3</span><span class="p" data-group-id="2926354779-5">]</span></code></pre>
<p>Guard clauses can also be given to the match:</p>
<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">list</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p" data-group-id="2871731175-1">[</span><span class="ss">a</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="ss">b</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="ss">a</span><span class="p">:</span><span class="w"> </span><span class="mi">3</span><span class="p" data-group-id="2871731175-1">]</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="nc">Enum</span><span class="o">.</span><span class="n">filter</span><span class="p" data-group-id="2871731175-2">(</span><span class="n">list</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">match?</span><span class="p" data-group-id="2871731175-3">(</span><span class="p" data-group-id="2871731175-4">{</span><span class="ss">:a</span><span class="p">,</span><span class="w"> </span><span class="n">x</span><span class="p" data-group-id="2871731175-4">}</span><span class="w"> </span><span class="ow">when</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="ni">&amp;1</span><span class="p" data-group-id="2871731175-3">)</span><span class="p" data-group-id="2871731175-2">)</span><span class="w">
</span><span class="p" data-group-id="2871731175-5">[</span><span class="ss">a</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p" data-group-id="2871731175-5">]</span></code></pre>
<p>However, variables assigned in the match will not be available
outside of the function call (unlike regular pattern matching with the <code class="inline">=</code>
operator):</p>
<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">match?</span><span class="p" data-group-id="2765044902-1">(</span><span class="c">_x</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p" data-group-id="2765044902-1">)</span><span class="w">
</span><span class="no">true</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="n">binding</span><span class="p" data-group-id="2765044902-2">(</span><span class="p" data-group-id="2765044902-2">)</span><span class="w">
</span><span class="p" data-group-id="2765044902-3">[</span><span class="p" data-group-id="2765044902-3">]</span></code></pre>
  </section>
</div>
<div class="detail" id="max/2">
    <div class="detail-header">
    <a href="#max/2" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">max(first, second)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L689" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>max(first, second) :: first | second when first: <a href="typespecs.html#built-in-types">term</a>(), second: <a href="typespecs.html#built-in-types">term</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Returns the biggest of the two given terms according to
Erlang’s term ordering.</p>
<p>If the terms compare equal, the first one is returned.</p>
<p>Inlined by the compiler.</p>
<h2 id="max/2-examples" class="section-heading">
  <a href="#max/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">max</span><span class="p" data-group-id="6545824323-1">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p" data-group-id="6545824323-1">)</span><span class="w">
</span><span class="mi">2</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="n">max</span><span class="p" data-group-id="6545824323-2">(</span><span class="ss">:a</span><span class="p">,</span><span class="w"> </span><span class="ss">:b</span><span class="p" data-group-id="6545824323-2">)</span><span class="w">
</span><span class="ss">:b</span></code></pre>
<p>Using Erlang’s term ordering means that comparisons are
structural and not semantic. For example, when comparing dates:</p>
<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">max</span><span class="p" data-group-id="8999477131-1">(</span><span class="ld">~D[2017-03-31]</span><span class="p">,</span><span class="w"> </span><span class="ld">~D[2017-04-01]</span><span class="p" data-group-id="8999477131-1">)</span><span class="w">
</span><span class="ld">~D[2017-03-31]</span></code></pre>
<p>In the example above, <code class="inline">max/1</code> returned March 31st instead of April 1st
because the structural comparison compares the day before the year. In
such cases it is common for modules to provide functions such as
<a href="https://hexdocs.pm/elixir/Date.html#compare/1"><code class="inline">Date.compare/1</code></a> that perform semantic comparison.</p>
  </section>
</div>
<div class="detail" id="min/2">
    <div class="detail-header">
    <a href="#min/2" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">min(first, second)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L720" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>min(first, second) :: first | second when first: <a href="typespecs.html#built-in-types">term</a>(), second: <a href="typespecs.html#built-in-types">term</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Returns the smallest of the two given terms according to
Erlang’s term ordering.</p>
<p>If the terms compare equal, the first one is returned.</p>
<p>Inlined by the compiler.</p>
<h2 id="min/2-examples" class="section-heading">
  <a href="#min/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">min</span><span class="p" data-group-id="7825867262-1">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p" data-group-id="7825867262-1">)</span><span class="w">
</span><span class="mi">1</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="n">min</span><span class="p" data-group-id="7825867262-2">(</span><span class="s">&quot;foo&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;bar&quot;</span><span class="p" data-group-id="7825867262-2">)</span><span class="w">
</span><span class="s">&quot;bar&quot;</span></code></pre>
<p>Using Erlang’s term ordering means that comparisons are
structural and not semantic. For example, when comparing dates:</p>
<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">min</span><span class="p" data-group-id="2783566663-1">(</span><span class="ld">~D[2017-03-31]</span><span class="p">,</span><span class="w"> </span><span class="ld">~D[2017-04-01]</span><span class="p" data-group-id="2783566663-1">)</span><span class="w">
</span><span class="ld">~D[2017-04-01]</span></code></pre>
<p>In the example above, <code class="inline">min/1</code> returned April 1st instead of March 31st
because the structural comparison compares the day before the year. In
such cases it is common for modules to provide functions such as
<a href="https://hexdocs.pm/elixir/Date.html#compare/1"><code class="inline">Date.compare/1</code></a> that perform semantic comparison.</p>
  </section>
</div>
<div class="detail" id="node/0">
    <div class="detail-header">
    <a href="#node/0" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">node()</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L731" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>node() :: <a href="typespecs.html#built-in-types">node</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Returns an atom representing the name of the local node.
If the node is not alive, <code class="inline">:nonode@nohost</code> is returned instead.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
  </section>
</div>
<div class="detail" id="node/1">
    <div class="detail-header">
    <a href="#node/1" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">node(arg)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L743" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>node(<a href="typespecs.html#basic-types">pid</a>() | <a href="typespecs.html#basic-types">reference</a>() | <a href="typespecs.html#basic-types">port</a>()) :: <a href="typespecs.html#built-in-types">node</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Returns the node where the given argument is located.
The argument can be a PID, a reference, or a port.
If the local node is not alive, <code class="inline">:nonode@nohost</code> is returned.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
  </section>
</div>
<div class="detail" id="not/1">
    <div class="detail-header">
    <a href="#not/1" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">not(value)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L1266" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>not true :: false</pre>
          <pre>not false :: true</pre>
      </div>
  </div>
  <section class="docstring">
<p>Boolean not.</p>
<p><code class="inline">arg</code> must be a boolean; if it’s not, an <a href="ArgumentError.html"><code class="inline">ArgumentError</code></a> exception is raised.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
<h2 id="not/1-examples" class="section-heading">
  <a href="#not/1-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="ow">not</span><span class="w"> </span><span class="no">false</span><span class="w">
</span><span class="no">true</span></code></pre>
  </section>
</div>
<div class="detail" id="or/2">
    <div class="detail-header">
    <a href="#or/2" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">left or right</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L1504" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Boolean or.</p>
<p>If <code class="inline">left</code> is <code class="inline">true</code>, returns <code class="inline">true</code>; otherwise returns <code class="inline">right</code>.</p>
<p>Requires only the <code class="inline">left</code> operand to be a boolean since it short-circuits.
If the <code class="inline">left</code> operand is not a boolean, an <a href="ArgumentError.html"><code class="inline">ArgumentError</code></a> exception is
raised.</p>
<p>Allowed in guard tests.</p>
<h2 id="or/2-examples" class="section-heading">
  <a href="#or/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="no">true</span><span class="w"> </span><span class="ow">or</span><span class="w"> </span><span class="no">false</span><span class="w">
</span><span class="no">true</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="no">false</span><span class="w"> </span><span class="ow">or</span><span class="w"> </span><span class="mi">42</span><span class="w">
</span><span class="mi">42</span></code></pre>
  </section>
</div>
<div class="detail" id="pop_in/1">
    <div class="detail-header">
    <a href="#pop_in/1" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">pop_in(path)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L2336" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Pops a key from the nested structure via the given <code class="inline">path</code>.</p>
<p>This is similar to <a href="#pop_in/2"><code class="inline">pop_in/2</code></a>, except the path is extracted via
a macro rather than passing a list. For example:</p>
<pre><code class="nohighlight makeup elixir"><span class="n">pop_in</span><span class="p" data-group-id="6086946983-1">(</span><span class="n">opts</span><span class="p" data-group-id="6086946983-2">[</span><span class="ss">:foo</span><span class="p" data-group-id="6086946983-2">]</span><span class="p" data-group-id="6086946983-3">[</span><span class="ss">:bar</span><span class="p" data-group-id="6086946983-3">]</span><span class="p" data-group-id="6086946983-1">)</span></code></pre>
<p>Is equivalent to:</p>
<pre><code class="nohighlight makeup elixir"><span class="n">pop_in</span><span class="p" data-group-id="8622011224-1">(</span><span class="n">opts</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="8622011224-2">[</span><span class="ss">:foo</span><span class="p">,</span><span class="w"> </span><span class="ss">:bar</span><span class="p" data-group-id="8622011224-2">]</span><span class="p" data-group-id="8622011224-1">)</span></code></pre>
<p>Note that in order for this macro to work, the complete path must always
be visible by this macro. For more information about the supported path
expressions, please check <a href="#get_and_update_in/2"><code class="inline">get_and_update_in/2</code></a> docs.</p>
<h2 id="pop_in/1-examples" class="section-heading">
  <a href="#pop_in/1-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">users</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p" data-group-id="6108583434-1">%{</span><span class="s">&quot;john&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="6108583434-2">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">27</span><span class="p" data-group-id="6108583434-2">}</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;meg&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="6108583434-3">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">23</span><span class="p" data-group-id="6108583434-3">}</span><span class="p" data-group-id="6108583434-1">}</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="n">pop_in</span><span class="p" data-group-id="6108583434-4">(</span><span class="n">users</span><span class="p" data-group-id="6108583434-5">[</span><span class="s">&quot;john&quot;</span><span class="p" data-group-id="6108583434-5">]</span><span class="p" data-group-id="6108583434-6">[</span><span class="ss">:age</span><span class="p" data-group-id="6108583434-6">]</span><span class="p" data-group-id="6108583434-4">)</span><span class="w">
</span><span class="p" data-group-id="6108583434-7">{</span><span class="mi">27</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="6108583434-8">%{</span><span class="s">&quot;john&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="6108583434-9">%{</span><span class="p" data-group-id="6108583434-9">}</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;meg&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="6108583434-10">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">23</span><span class="p" data-group-id="6108583434-10">}</span><span class="p" data-group-id="6108583434-8">}</span><span class="p" data-group-id="6108583434-7">}</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="n">users</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p" data-group-id="6108583434-11">%{</span><span class="ss">john</span><span class="p">:</span><span class="w"> </span><span class="p" data-group-id="6108583434-12">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">27</span><span class="p" data-group-id="6108583434-12">}</span><span class="p">,</span><span class="w"> </span><span class="ss">meg</span><span class="p">:</span><span class="w"> </span><span class="p" data-group-id="6108583434-13">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">23</span><span class="p" data-group-id="6108583434-13">}</span><span class="p" data-group-id="6108583434-11">}</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="n">pop_in</span><span class="p" data-group-id="6108583434-14">(</span><span class="n">users</span><span class="o">.</span><span class="n">john</span><span class="p" data-group-id="6108583434-15">[</span><span class="ss">:age</span><span class="p" data-group-id="6108583434-15">]</span><span class="p" data-group-id="6108583434-14">)</span><span class="w">
</span><span class="p" data-group-id="6108583434-16">{</span><span class="mi">27</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="6108583434-17">%{</span><span class="ss">john</span><span class="p">:</span><span class="w"> </span><span class="p" data-group-id="6108583434-18">%{</span><span class="p" data-group-id="6108583434-18">}</span><span class="p">,</span><span class="w"> </span><span class="ss">meg</span><span class="p">:</span><span class="w"> </span><span class="p" data-group-id="6108583434-19">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">23</span><span class="p" data-group-id="6108583434-19">}</span><span class="p" data-group-id="6108583434-17">}</span><span class="p" data-group-id="6108583434-16">}</span></code></pre>
<p>In case any entry returns <code class="inline">nil</code>, its key will be removed
and the deletion will be considered a success.</p>
  </section>
</div>
<div class="detail" id="pop_in/2">
    <div class="detail-header">
    <a href="#pop_in/2" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">pop_in(data, keys)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L2252" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>pop_in(data, [<a href="Access.html#t:get_and_update_fun/2">Access.get_and_update_fun</a>(<a href="typespecs.html#built-in-types">term</a>(), data) | <a href="typespecs.html#built-in-types">term</a>(), ...]) ::
  {<a href="typespecs.html#built-in-types">term</a>(), data}
when data: <a href="Access.html#t:container/0">Access.container</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Pops a key from the given nested structure.</p>
<p>Uses the <a href="Access.html"><code class="inline">Access</code></a> protocol to traverse the structures
according to the given <code class="inline">keys</code>, unless the <code class="inline">key</code> is a
function. If the key is a function, it will be invoked
as specified in <a href="#get_and_update_in/3"><code class="inline">get_and_update_in/3</code></a>.</p>
<h2 id="pop_in/2-examples" class="section-heading">
  <a href="#pop_in/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">users</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p" data-group-id="5643531523-1">%{</span><span class="s">&quot;john&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="5643531523-2">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">27</span><span class="p" data-group-id="5643531523-2">}</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;meg&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="5643531523-3">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">23</span><span class="p" data-group-id="5643531523-3">}</span><span class="p" data-group-id="5643531523-1">}</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="n">pop_in</span><span class="p" data-group-id="5643531523-4">(</span><span class="n">users</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="5643531523-5">[</span><span class="s">&quot;john&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">:age</span><span class="p" data-group-id="5643531523-5">]</span><span class="p" data-group-id="5643531523-4">)</span><span class="w">
</span><span class="p" data-group-id="5643531523-6">{</span><span class="mi">27</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="5643531523-7">%{</span><span class="s">&quot;john&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="5643531523-8">%{</span><span class="p" data-group-id="5643531523-8">}</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;meg&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="5643531523-9">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">23</span><span class="p" data-group-id="5643531523-9">}</span><span class="p" data-group-id="5643531523-7">}</span><span class="p" data-group-id="5643531523-6">}</span></code></pre>
<p>In case any entry returns <code class="inline">nil</code>, its key will be removed
and the deletion will be considered a success.</p>
<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">users</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p" data-group-id="8441888817-1">%{</span><span class="s">&quot;john&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="8441888817-2">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">27</span><span class="p" data-group-id="8441888817-2">}</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;meg&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="8441888817-3">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">23</span><span class="p" data-group-id="8441888817-3">}</span><span class="p" data-group-id="8441888817-1">}</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="n">pop_in</span><span class="p" data-group-id="8441888817-4">(</span><span class="n">users</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="8441888817-5">[</span><span class="s">&quot;jane&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">:age</span><span class="p" data-group-id="8441888817-5">]</span><span class="p" data-group-id="8441888817-4">)</span><span class="w">
</span><span class="p" data-group-id="8441888817-6">{</span><span class="no">nil</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="8441888817-7">%{</span><span class="s">&quot;john&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="8441888817-8">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">27</span><span class="p" data-group-id="8441888817-8">}</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;meg&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="8441888817-9">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">23</span><span class="p" data-group-id="8441888817-9">}</span><span class="p" data-group-id="8441888817-7">}</span><span class="p" data-group-id="8441888817-6">}</span></code></pre>
  </section>
</div>
<div class="detail" id="put_elem/3">
    <div class="detail-header">
    <a href="#put_elem/3" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">put_elem(tuple, index, value)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L1475" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>put_elem(<a href="typespecs.html#basic-types">tuple</a>(), <a href="typespecs.html#basic-types">non_neg_integer</a>(), <a href="typespecs.html#built-in-types">term</a>()) :: <a href="typespecs.html#basic-types">tuple</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Puts <code class="inline">value</code> at the given zero-based <code class="inline">index</code> in <code class="inline">tuple</code>.</p>
<p>Inlined by the compiler.</p>
<h2 id="put_elem/3-examples" class="section-heading">
  <a href="#put_elem/3-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">tuple</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p" data-group-id="5374371276-1">{</span><span class="ss">:foo</span><span class="p">,</span><span class="w"> </span><span class="ss">:bar</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p" data-group-id="5374371276-1">}</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="n">put_elem</span><span class="p" data-group-id="5374371276-2">(</span><span class="n">tuple</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="ss">:baz</span><span class="p" data-group-id="5374371276-2">)</span><span class="w">
</span><span class="p" data-group-id="5374371276-3">{</span><span class="ss">:baz</span><span class="p">,</span><span class="w"> </span><span class="ss">:bar</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p" data-group-id="5374371276-3">}</span></code></pre>
  </section>
</div>
<div class="detail" id="put_in/2">
    <div class="detail-header">
    <a href="#put_in/2" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">put_in(path, value)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L2296" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Puts a value in a nested structure via the given <code class="inline">path</code>.</p>
<p>This is similar to <a href="#put_in/3"><code class="inline">put_in/3</code></a>, except the path is extracted via
a macro rather than passing a list. For example:</p>
<pre><code class="nohighlight makeup elixir"><span class="n">put_in</span><span class="p" data-group-id="4608620563-1">(</span><span class="n">opts</span><span class="p" data-group-id="4608620563-2">[</span><span class="ss">:foo</span><span class="p" data-group-id="4608620563-2">]</span><span class="p" data-group-id="4608620563-3">[</span><span class="ss">:bar</span><span class="p" data-group-id="4608620563-3">]</span><span class="p">,</span><span class="w"> </span><span class="ss">:baz</span><span class="p" data-group-id="4608620563-1">)</span></code></pre>
<p>Is equivalent to:</p>
<pre><code class="nohighlight makeup elixir"><span class="n">put_in</span><span class="p" data-group-id="1079638644-1">(</span><span class="n">opts</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="1079638644-2">[</span><span class="ss">:foo</span><span class="p">,</span><span class="w"> </span><span class="ss">:bar</span><span class="p" data-group-id="1079638644-2">]</span><span class="p">,</span><span class="w"> </span><span class="ss">:baz</span><span class="p" data-group-id="1079638644-1">)</span></code></pre>
<p>Note that in order for this macro to work, the complete path must always
be visible by this macro. For more information about the supported path
expressions, please check <a href="#get_and_update_in/2"><code class="inline">get_and_update_in/2</code></a> docs.</p>
<h2 id="put_in/2-examples" class="section-heading">
  <a href="#put_in/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">users</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p" data-group-id="5069463681-1">%{</span><span class="s">&quot;john&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="5069463681-2">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">27</span><span class="p" data-group-id="5069463681-2">}</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;meg&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="5069463681-3">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">23</span><span class="p" data-group-id="5069463681-3">}</span><span class="p" data-group-id="5069463681-1">}</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="n">put_in</span><span class="p" data-group-id="5069463681-4">(</span><span class="n">users</span><span class="p" data-group-id="5069463681-5">[</span><span class="s">&quot;john&quot;</span><span class="p" data-group-id="5069463681-5">]</span><span class="p" data-group-id="5069463681-6">[</span><span class="ss">:age</span><span class="p" data-group-id="5069463681-6">]</span><span class="p">,</span><span class="w"> </span><span class="mi">28</span><span class="p" data-group-id="5069463681-4">)</span><span class="w">
</span><span class="p" data-group-id="5069463681-7">%{</span><span class="s">&quot;john&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="5069463681-8">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">28</span><span class="p" data-group-id="5069463681-8">}</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;meg&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="5069463681-9">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">23</span><span class="p" data-group-id="5069463681-9">}</span><span class="p" data-group-id="5069463681-7">}</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="n">users</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p" data-group-id="5069463681-10">%{</span><span class="s">&quot;john&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="5069463681-11">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">27</span><span class="p" data-group-id="5069463681-11">}</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;meg&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="5069463681-12">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">23</span><span class="p" data-group-id="5069463681-12">}</span><span class="p" data-group-id="5069463681-10">}</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="n">put_in</span><span class="p" data-group-id="5069463681-13">(</span><span class="n">users</span><span class="p" data-group-id="5069463681-14">[</span><span class="s">&quot;john&quot;</span><span class="p" data-group-id="5069463681-14">]</span><span class="o">.</span><span class="n">age</span><span class="p">,</span><span class="w"> </span><span class="mi">28</span><span class="p" data-group-id="5069463681-13">)</span><span class="w">
</span><span class="p" data-group-id="5069463681-15">%{</span><span class="s">&quot;john&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="5069463681-16">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">28</span><span class="p" data-group-id="5069463681-16">}</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;meg&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="5069463681-17">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">23</span><span class="p" data-group-id="5069463681-17">}</span><span class="p" data-group-id="5069463681-15">}</span></code></pre>
  </section>
</div>
<div class="detail" id="put_in/3">
    <div class="detail-header">
    <a href="#put_in/3" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">put_in(data, keys, value)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L2113" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>put_in(<a href="Access.html#t:t/0">Access.t</a>(), [<a href="typespecs.html#built-in-types">term</a>(), ...], <a href="typespecs.html#built-in-types">term</a>()) :: <a href="Access.html#t:t/0">Access.t</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Puts a value in a nested structure.</p>
<p>Uses the <a href="Access.html"><code class="inline">Access</code></a> module to traverse the structures
according to the given <code class="inline">keys</code>, unless the <code class="inline">key</code> is a
function. If the key is a function, it will be invoked
as specified in <a href="#get_and_update_in/3"><code class="inline">get_and_update_in/3</code></a>.</p>
<h2 id="put_in/3-examples" class="section-heading">
  <a href="#put_in/3-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">users</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p" data-group-id="4088646582-1">%{</span><span class="s">&quot;john&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="4088646582-2">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">27</span><span class="p" data-group-id="4088646582-2">}</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;meg&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="4088646582-3">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">23</span><span class="p" data-group-id="4088646582-3">}</span><span class="p" data-group-id="4088646582-1">}</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="n">put_in</span><span class="p" data-group-id="4088646582-4">(</span><span class="n">users</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="4088646582-5">[</span><span class="s">&quot;john&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">:age</span><span class="p" data-group-id="4088646582-5">]</span><span class="p">,</span><span class="w"> </span><span class="mi">28</span><span class="p" data-group-id="4088646582-4">)</span><span class="w">
</span><span class="p" data-group-id="4088646582-6">%{</span><span class="s">&quot;john&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="4088646582-7">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">28</span><span class="p" data-group-id="4088646582-7">}</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;meg&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="4088646582-8">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">23</span><span class="p" data-group-id="4088646582-8">}</span><span class="p" data-group-id="4088646582-6">}</span></code></pre>
<p>In case any of the entries in the middle returns <code class="inline">nil</code>,
an error will be raised when trying to access it next.</p>
  </section>
</div>
<div class="detail" id="raise/1">
    <div class="detail-header">
    <a href="#raise/1" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">raise(message)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L1706" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Raises an exception.</p>
<p>If the argument <code class="inline">msg</code> is a binary, it raises a <a href="RuntimeError.html"><code class="inline">RuntimeError</code></a> exception
using the given argument as message.</p>
<p>If <code class="inline">msg</code> is an atom, it just calls <a href="#raise/2"><code class="inline">raise/2</code></a> with the atom as the first
argument and <code class="inline">[]</code> as the second argument.</p>
<p>If <code class="inline">msg</code> is an exception struct, it is raised as is.</p>
<p>If <code class="inline">msg</code> is anything else, <code class="inline">raise</code> will fail with an <a href="ArgumentError.html"><code class="inline">ArgumentError</code></a>
exception.</p>
<h2 id="raise/1-examples" class="section-heading">
  <a href="#raise/1-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="k">raise</span><span class="w"> </span><span class="s">&quot;oops&quot;</span><span class="w">
</span><span class="gt">** (RuntimeError) oops</span><span class="w">

</span><span class="k">try</span><span class="w"> </span><span class="k" data-group-id="4926858668-1">do</span><span class="w">
  </span><span class="mi">1</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="ss">:foo</span><span class="w">
</span><span class="k" data-group-id="4926858668-1">rescue</span><span class="w">
  </span><span class="n">x</span><span class="w"> </span><span class="ow">in</span><span class="w"> </span><span class="p" data-group-id="4926858668-2">[</span><span class="nc">ArithmeticError</span><span class="p" data-group-id="4926858668-2">]</span><span class="w"> </span><span class="o">-&gt;</span><span class="w">
    </span><span class="nc">IO</span><span class="o">.</span><span class="n">puts</span><span class="w"> </span><span class="s">&quot;that was expected&quot;</span><span class="w">
    </span><span class="k">raise</span><span class="w"> </span><span class="n">x</span><span class="w">
</span><span class="k" data-group-id="4926858668-1">end</span></code></pre>
  </section>
</div>
<div class="detail" id="raise/2">
    <div class="detail-header">
    <a href="#raise/2" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">raise(exception, attributes)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L1755" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Raises an exception.</p>
<p>Calls the <code class="inline">exception/1</code> function on the given argument (which has to be a
module name like <a href="ArgumentError.html"><code class="inline">ArgumentError</code></a> or <a href="RuntimeError.html"><code class="inline">RuntimeError</code></a>) passing <code class="inline">attrs</code> as the
attributes in order to retrieve the exception struct.</p>
<p>Any module that contains a call to the <a href="#defexception/1"><code class="inline">defexception/1</code></a> macro automatically
implements the <a href="Exception.html#c:exception/1"><code class="inline">Exception.exception/1</code></a> callback expected by <a href="#raise/2"><code class="inline">raise/2</code></a>.
For more information, see <a href="#defexception/1"><code class="inline">defexception/1</code></a>.</p>
<h2 id="raise/2-examples" class="section-heading">
  <a href="#raise/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="k">raise</span><span class="p" data-group-id="2680761904-1">(</span><span class="nc">ArgumentError</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;Sample&quot;</span><span class="p" data-group-id="2680761904-1">)</span><span class="w">
</span><span class="gt">** (ArgumentError) Sample</span></code></pre>
  </section>
</div>
<div class="detail" id="rem/2">
    <div class="detail-header">
    <a href="#rem/2" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">rem(dividend, divisor)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L767" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>rem(<a href="typespecs.html#basic-types">integer</a>(), <a href="typespecs.html#basic-types">neg_integer</a>() | <a href="typespecs.html#basic-types">pos_integer</a>()) :: <a href="typespecs.html#basic-types">integer</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Computes the remainder of an integer division.</p>
<p><a href="#rem/2"><code class="inline">rem/2</code></a> uses truncated division, which means that
the result will always have the sign of the <code class="inline">dividend</code>.</p>
<p>Raises an <a href="ArithmeticError.html"><code class="inline">ArithmeticError</code></a> exception if one of the arguments is not an
integer, or when the <code class="inline">divisor</code> is <code class="inline">0</code>.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
<h2 id="rem/2-examples" class="section-heading">
  <a href="#rem/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">rem</span><span class="p" data-group-id="7047398138-1">(</span><span class="mi">5</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p" data-group-id="7047398138-1">)</span><span class="w">
</span><span class="mi">1</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="n">rem</span><span class="p" data-group-id="7047398138-2">(</span><span class="mi">6</span><span class="p">,</span><span class="w"> </span><span class="o">-</span><span class="mi">4</span><span class="p" data-group-id="7047398138-2">)</span><span class="w">
</span><span class="mi">2</span></code></pre>
  </section>
</div>
<div class="detail" id="reraise/2">
    <div class="detail-header">
    <a href="#reraise/2" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">reraise(message, stacktrace)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L1779" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Raises an exception preserving a previous stacktrace.</p>
<p>Works like <a href="#raise/1"><code class="inline">raise/1</code></a> but does not generate a new stacktrace.</p>
<p>Notice that <code class="inline">__STACKTRACE__</code> can be used inside catch/rescue
to retrieve the current stacktrace.</p>
<h2 id="reraise/2-examples" class="section-heading">
  <a href="#reraise/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="k">try</span><span class="w"> </span><span class="k" data-group-id="4197236483-1">do</span><span class="w">
  </span><span class="k">raise</span><span class="w"> </span><span class="s">&quot;oops&quot;</span><span class="w">
</span><span class="k" data-group-id="4197236483-1">rescue</span><span class="w">
  </span><span class="n">exception</span><span class="w"> </span><span class="o">-&gt;</span><span class="w">
    </span><span class="n">reraise</span><span class="w"> </span><span class="n">exception</span><span class="p">,</span><span class="w"> </span><span class="c">__STACKTRACE__</span><span class="w">
</span><span class="k" data-group-id="4197236483-1">end</span></code></pre>
  </section>
</div>
<div class="detail" id="reraise/3">
    <div class="detail-header">
    <a href="#reraise/3" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">reraise(exception, attributes, stacktrace)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L1822" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Raises an exception preserving a previous stacktrace.</p>
<p><a href="#reraise/3"><code class="inline">reraise/3</code></a> works like <a href="#reraise/2"><code class="inline">reraise/2</code></a>, except it passes arguments to the
<code class="inline">exception/1</code> function as explained in <a href="#raise/2"><code class="inline">raise/2</code></a>.</p>
<h2 id="reraise/3-examples" class="section-heading">
  <a href="#reraise/3-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="k">try</span><span class="w"> </span><span class="k" data-group-id="2017725759-1">do</span><span class="w">
  </span><span class="k">raise</span><span class="w"> </span><span class="s">&quot;oops&quot;</span><span class="w">
</span><span class="k" data-group-id="2017725759-1">rescue</span><span class="w">
  </span><span class="n">exception</span><span class="w"> </span><span class="o">-&gt;</span><span class="w">
    </span><span class="n">reraise</span><span class="w"> </span><span class="nc">WrapperError</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="2017725759-2">[</span><span class="ss">exception</span><span class="p">:</span><span class="w"> </span><span class="n">exception</span><span class="p" data-group-id="2017725759-2">]</span><span class="p">,</span><span class="w"> </span><span class="c">__STACKTRACE__</span><span class="w">
</span><span class="k" data-group-id="2017725759-1">end</span></code></pre>
  </section>
</div>
<div class="detail" id="round/1">
    <div class="detail-header">
    <a href="#round/1" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">round(number)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L793" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>round(<a href="typespecs.html#basic-types">float</a>()) :: <a href="typespecs.html#basic-types">integer</a>()</pre>
          <pre>round(value) :: value when value: <a href="typespecs.html#basic-types">integer</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Rounds a number to the nearest integer.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
<h2 id="round/1-examples" class="section-heading">
  <a href="#round/1-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">round</span><span class="p" data-group-id="4599447437-1">(</span><span class="mf">5.6</span><span class="p" data-group-id="4599447437-1">)</span><span class="w">
</span><span class="mi">6</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="n">round</span><span class="p" data-group-id="4599447437-2">(</span><span class="mf">5.2</span><span class="p" data-group-id="4599447437-2">)</span><span class="w">
</span><span class="mi">5</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="n">round</span><span class="p" data-group-id="4599447437-3">(</span><span class="o">-</span><span class="mf">9.9</span><span class="p" data-group-id="4599447437-3">)</span><span class="w">
</span><span class="o">-</span><span class="mi">10</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="n">round</span><span class="p" data-group-id="4599447437-4">(</span><span class="o">-</span><span class="mi">9</span><span class="p" data-group-id="4599447437-4">)</span><span class="w">
</span><span class="o">-</span><span class="mi">9</span></code></pre>
  </section>
</div>
<div class="detail" id="self/0">
    <div class="detail-header">
    <a href="#self/0" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">self()</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L823" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>self() :: <a href="typespecs.html#basic-types">pid</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Returns the PID (process identifier) of the calling process.</p>
<p>Allowed in guard clauses. Inlined by the compiler.</p>
  </section>
</div>
<div class="detail" id="send/2">
    <div class="detail-header">
    <a href="#send/2" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">send(dest, message)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L813" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>send(dest :: <a href="Process.html#t:dest/0">Process.dest</a>(), message) :: message when message: <a href="typespecs.html#basic-types">any</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Sends a message to the given <code class="inline">dest</code> and returns the message.</p>
<p><code class="inline">dest</code> may be a remote or local PID, a local port, a locally
registered name, or a tuple in the form of <code class="inline">{registered_name, node}</code> for a
registered name at another node.</p>
<p>Inlined by the compiler.</p>
<h2 id="send/2-examples" class="section-heading">
  <a href="#send/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">send</span><span class="p" data-group-id="6575839541-1">(</span><span class="n">self</span><span class="p" data-group-id="6575839541-2">(</span><span class="p" data-group-id="6575839541-2">)</span><span class="p">,</span><span class="w"> </span><span class="ss">:hello</span><span class="p" data-group-id="6575839541-1">)</span><span class="w">
</span><span class="ss">:hello</span></code></pre>
  </section>
</div>
<div class="detail" id="sigil_C/2">
    <div class="detail-header">
    <a href="#sigil_C/2" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">sigil_C(term, modifiers)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L4965" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Handles the sigil <code class="inline">~C</code> for charlists.</p>
<p>It simply returns a charlist without escaping characters and without
interpolations.</p>
<h2 id="sigil_C/2-examples" class="section-heading">
  <a href="#sigil_C/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="sx">~C(foo)</span><span class="w">
</span><span class="sc">&#39;foo&#39;</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="sx">~C(f</span><span class="si" data-group-id="8382763768-1">#{</span><span class="n">o</span><span class="si" data-group-id="8382763768-1">}</span><span class="sx">o)</span><span class="w">
</span><span class="sc">&#39;f</span><span class="se">\#</span><span class="sc">{o}o&#39;</span></code></pre>
  </section>
</div>
<div class="detail" id="sigil_D/2">
    <div class="detail-header">
    <a href="#sigil_D/2" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">sigil_D(date, modifiers)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L5067" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Handles the sigil <code class="inline">~D</code> for dates.</p>
<p>The lower case <code class="inline">~d</code> variant does not exist as interpolation
and escape characters are not useful for date sigils.</p>
<p>More information on dates can be found in the <a href="Date.html"><code class="inline">Date</code></a> module.</p>
<h2 id="sigil_D/2-examples" class="section-heading">
  <a href="#sigil_D/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="ld">~D[2015-01-13]</span><span class="w">
</span><span class="ld">~D[2015-01-13]</span></code></pre>
  </section>
</div>
<div class="detail" id="sigil_N/2">
    <div class="detail-header">
    <a href="#sigil_N/2" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">sigil_N(date, modifiers)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L5111" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Handles the sigil <code class="inline">~N</code> for naive date times.</p>
<p>The lower case <code class="inline">~n</code> variant does not exist as interpolation
and escape characters are not useful for datetime sigils.</p>
<p>More information on naive date times can be found in the <a href="NaiveDateTime.html"><code class="inline">NaiveDateTime</code></a> module.</p>
<h2 id="sigil_N/2-examples" class="section-heading">
  <a href="#sigil_N/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="ld">~N[2015-01-13 13:00:07]</span><span class="w">
</span><span class="ld">~N[2015-01-13 13:00:07]</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="ld">~N[2015-01-13T13:00:07.001]</span><span class="w">
</span><span class="ld">~N[2015-01-13 13:00:07.001]</span></code></pre>
  </section>
</div>
<div class="detail" id="sigil_R/2">
    <div class="detail-header">
    <a href="#sigil_R/2" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">sigil_R(term, modifiers)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L5046" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Handles the sigil <code class="inline">~R</code> for regular expressions.</p>
<p>It returns a regular expression pattern without escaping
nor interpreting interpolations.</p>
<p>More information on regexes can be found in the <a href="Regex.html"><code class="inline">Regex</code></a> module.</p>
<h2 id="sigil_R/2-examples" class="section-heading">
  <a href="#sigil_R/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="nc">Regex</span><span class="o">.</span><span class="n">match?</span><span class="p" data-group-id="8189895615-1">(</span><span class="sr">~R(f</span><span class="si" data-group-id="8189895615-2">#{</span><span class="mi">1</span><span class="p">,</span><span class="mi">3</span><span class="si" data-group-id="8189895615-2">}</span><span class="sr">o)</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;f#o&quot;</span><span class="p" data-group-id="8189895615-1">)</span><span class="w">
</span><span class="no">true</span></code></pre>
  </section>
</div>
<div class="detail" id="sigil_S/2">
    <div class="detail-header">
    <a href="#sigil_S/2" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">sigil_S(term, modifiers)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L4918" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Handles the sigil <code class="inline">~S</code> for strings.</p>
<p>It simply returns a string without escaping characters and without
interpolations.</p>
<h2 id="sigil_S/2-examples" class="section-heading">
  <a href="#sigil_S/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="s">~S(foo)</span><span class="w">
</span><span class="s">&quot;foo&quot;</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="s">~S(f</span><span class="si" data-group-id="4079130776-1">#{</span><span class="n">o</span><span class="si" data-group-id="4079130776-1">}</span><span class="s">o)</span><span class="w">
</span><span class="s">&quot;f</span><span class="se">\#</span><span class="s">{o}o&quot;</span></code></pre>
  </section>
</div>
<div class="detail" id="sigil_T/2">
    <div class="detail-header">
    <a href="#sigil_T/2" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">sigil_T(date, modifiers)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L5089" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Handles the sigil <code class="inline">~T</code> for times.</p>
<p>The lower case <code class="inline">~t</code> variant does not exist as interpolation
and escape characters are not useful for time sigils.</p>
<p>More information on times can be found in the <a href="Time.html"><code class="inline">Time</code></a> module.</p>
<h2 id="sigil_T/2-examples" class="section-heading">
  <a href="#sigil_T/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="sx">~T[13:00:07]</span><span class="w">
</span><span class="sx">~T[13:00:07]</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="sx">~T[13:00:07.001]</span><span class="w">
</span><span class="sx">~T[13:00:07.001]</span></code></pre>
  </section>
</div>
<div class="detail" id="sigil_W/2">
    <div class="detail-header">
    <a href="#sigil_W/2" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">sigil_W(term, modifiers)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L5173" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Handles the sigil <code class="inline">~W</code> for list of words.</p>
<p>It returns a list of “words” split by whitespace without escaping nor
interpreting interpolations.</p>
<h2 id="sigil_W/2-modifiers" class="section-heading">
  <a href="#sigil_W/2-modifiers" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Modifiers
</h2>

<ul>
<li><code class="inline">s</code>: words in the list are strings (default)
</li>
<li><code class="inline">a</code>: words in the list are atoms
</li>
<li><code class="inline">c</code>: words in the list are charlists
</li>
</ul>
<h2 id="sigil_W/2-examples" class="section-heading">
  <a href="#sigil_W/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="sx">~W(foo </span><span class="si" data-group-id="2071535927-1">#{</span><span class="n">bar</span><span class="si" data-group-id="2071535927-1">}</span><span class="sx"> baz)</span><span class="w">
</span><span class="p" data-group-id="2071535927-2">[</span><span class="s">&quot;foo&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;</span><span class="se">\#</span><span class="s">{bar}&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;baz&quot;</span><span class="p" data-group-id="2071535927-2">]</span></code></pre>
  </section>
</div>
<div class="detail" id="sigil_c/2">
    <div class="detail-header">
    <a href="#sigil_c/2" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">sigil_c(term, modifiers)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L4995" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Handles the sigil <code class="inline">~c</code> for charlists.</p>
<p>It returns a charlist as if it was a single quoted string, unescaping
characters and replacing interpolations.</p>
<h2 id="sigil_c/2-examples" class="section-heading">
  <a href="#sigil_c/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="s">~c(foo)</span><span class="w">
</span><span class="sc">&#39;foo&#39;</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="s">~c(f</span><span class="si" data-group-id="7178548587-1">#{</span><span class="ss">:o</span><span class="si" data-group-id="7178548587-1">}</span><span class="s">o)</span><span class="w">
</span><span class="sc">&#39;foo&#39;</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="s">~c(f</span><span class="se">\#</span><span class="s">{:o}o)</span><span class="w">
</span><span class="sc">&#39;f</span><span class="se">\#</span><span class="sc">{:o}o&#39;</span></code></pre>
  </section>
</div>
<div class="detail" id="sigil_r/2">
    <div class="detail-header">
    <a href="#sigil_r/2" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">sigil_r(term, modifiers)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L5025" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Handles the sigil <code class="inline">~r</code> for regular expressions.</p>
<p>It returns a regular expression pattern, unescaping characters and replacing
interpolations.</p>
<p>More information on regular expressions can be found in the <a href="Regex.html"><code class="inline">Regex</code></a> module.</p>
<h2 id="sigil_r/2-examples" class="section-heading">
  <a href="#sigil_r/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="nc">Regex</span><span class="o">.</span><span class="n">match?</span><span class="p" data-group-id="7185826402-1">(</span><span class="sr">~r(foo)</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;foo&quot;</span><span class="p" data-group-id="7185826402-1">)</span><span class="w">
</span><span class="no">true</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="nc">Regex</span><span class="o">.</span><span class="n">match?</span><span class="p" data-group-id="7185826402-2">(</span><span class="sr">~r/abc/</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;abc&quot;</span><span class="p" data-group-id="7185826402-2">)</span><span class="w">
</span><span class="no">true</span></code></pre>
  </section>
</div>
<div class="detail" id="sigil_s/2">
    <div class="detail-header">
    <a href="#sigil_s/2" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">sigil_s(term, modifiers)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L4944" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Handles the sigil <code class="inline">~s</code> for strings.</p>
<p>It returns a string as if it was a double quoted string, unescaping characters
and replacing interpolations.</p>
<h2 id="sigil_s/2-examples" class="section-heading">
  <a href="#sigil_s/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="s">~s(foo)</span><span class="w">
</span><span class="s">&quot;foo&quot;</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="s">~s(f</span><span class="si" data-group-id="5596852517-1">#{</span><span class="ss">:o</span><span class="si" data-group-id="5596852517-1">}</span><span class="s">o)</span><span class="w">
</span><span class="s">&quot;foo&quot;</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="s">~s(f</span><span class="se">\#</span><span class="s">{:o}o)</span><span class="w">
</span><span class="s">&quot;f</span><span class="se">\#</span><span class="s">{:o}o&quot;</span></code></pre>
  </section>
</div>
<div class="detail" id="sigil_w/2">
    <div class="detail-header">
    <a href="#sigil_w/2" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">sigil_w(term, modifiers)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L5148" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Handles the sigil <code class="inline">~w</code> for list of words.</p>
<p>It returns a list of “words” split by whitespace. Character unescaping and
interpolation happens for each word.</p>
<h2 id="sigil_w/2-modifiers" class="section-heading">
  <a href="#sigil_w/2-modifiers" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Modifiers
</h2>

<ul>
<li><code class="inline">s</code>: words in the list are strings (default)
</li>
<li><code class="inline">a</code>: words in the list are atoms
</li>
<li><code class="inline">c</code>: words in the list are charlists
</li>
</ul>
<h2 id="sigil_w/2-examples" class="section-heading">
  <a href="#sigil_w/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="sx">~w(foo </span><span class="si" data-group-id="2271076658-1">#{</span><span class="ss">:bar</span><span class="si" data-group-id="2271076658-1">}</span><span class="sx"> baz)</span><span class="w">
</span><span class="p" data-group-id="2271076658-2">[</span><span class="s">&quot;foo&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;bar&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;baz&quot;</span><span class="p" data-group-id="2271076658-2">]</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="sx">~w(foo </span><span class="si" data-group-id="2271076658-3">#{</span><span class="s">&quot; bar baz &quot;</span><span class="si" data-group-id="2271076658-3">}</span><span class="sx">)</span><span class="w">
</span><span class="p" data-group-id="2271076658-4">[</span><span class="s">&quot;foo&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;bar&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;baz&quot;</span><span class="p" data-group-id="2271076658-4">]</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="sx">~w(--source test/enum_test.exs)</span><span class="w">
</span><span class="p" data-group-id="2271076658-5">[</span><span class="s">&quot;--source&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;test/enum_test.exs&quot;</span><span class="p" data-group-id="2271076658-5">]</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="sx">~w(foo bar baz)a</span><span class="w">
</span><span class="p" data-group-id="2271076658-6">[</span><span class="ss">:foo</span><span class="p">,</span><span class="w"> </span><span class="ss">:bar</span><span class="p">,</span><span class="w"> </span><span class="ss">:baz</span><span class="p" data-group-id="2271076658-6">]</span></code></pre>
  </section>
</div>
<div class="detail" id="spawn/1">
    <div class="detail-header">
    <a href="#spawn/1" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">spawn(fun)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L852" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>spawn((() -> <a href="typespecs.html#basic-types">any</a>())) :: <a href="typespecs.html#basic-types">pid</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Spawns the given function and returns its PID.</p>
<p>Typically developers do not use the <code class="inline">spawn</code> functions, instead they use
abstractions such as <a href="Task.html"><code class="inline">Task</code></a>, <a href="GenServer.html"><code class="inline">GenServer</code></a> and <a href="Agent.html"><code class="inline">Agent</code></a>, built on top of
<code class="inline">spawn</code>, that spawns processes with more conveniences in terms of
introspection and debugging.</p>
<p>Check the <a href="Process.html"><code class="inline">Process</code></a> module for more process-related functions.</p>
<p>The anonymous function receives 0 arguments, and may return any value.</p>
<p>Inlined by the compiler.</p>
<h2 id="spawn/1-examples" class="section-heading">
  <a href="#spawn/1-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="n">current</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">self</span><span class="p" data-group-id="2988828737-1">(</span><span class="p" data-group-id="2988828737-1">)</span><span class="w">
</span><span class="n">child</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">spawn</span><span class="p" data-group-id="2988828737-2">(</span><span class="k" data-group-id="2988828737-3">fn</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">send</span><span class="w"> </span><span class="n">current</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="2988828737-4">{</span><span class="n">self</span><span class="p" data-group-id="2988828737-5">(</span><span class="p" data-group-id="2988828737-5">)</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">2</span><span class="p" data-group-id="2988828737-4">}</span><span class="w"> </span><span class="k" data-group-id="2988828737-3">end</span><span class="p" data-group-id="2988828737-2">)</span><span class="w">

</span><span class="k">receive</span><span class="w"> </span><span class="k" data-group-id="2988828737-6">do</span><span class="w">
  </span><span class="p" data-group-id="2988828737-7">{</span><span class="o">^</span><span class="n">child</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p" data-group-id="2988828737-7">}</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="nc">IO</span><span class="o">.</span><span class="n">puts</span><span class="w"> </span><span class="s">&quot;Received 3 back&quot;</span><span class="w">
</span><span class="k" data-group-id="2988828737-6">end</span></code></pre>
  </section>
</div>
<div class="detail" id="spawn/3">
    <div class="detail-header">
    <a href="#spawn/3" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">spawn(module, fun, args)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L875" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>spawn(<a href="typespecs.html#built-in-types">module</a>(), <a href="typespecs.html#basic-types">atom</a>(), <a href="typespecs.html#built-in-types">list</a>()) :: <a href="typespecs.html#basic-types">pid</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Spawns the given function <code class="inline">fun</code> from the given <code class="inline">module</code> passing it the given
<code class="inline">args</code> and returns its PID.</p>
<p>Typically developers do not use the <code class="inline">spawn</code> functions, instead they use
abstractions such as <a href="Task.html"><code class="inline">Task</code></a>, <a href="GenServer.html"><code class="inline">GenServer</code></a> and <a href="Agent.html"><code class="inline">Agent</code></a>, built on top of
<code class="inline">spawn</code>, that spawns processes with more conveniences in terms of
introspection and debugging.</p>
<p>Check the <a href="Process.html"><code class="inline">Process</code></a> module for more process-related functions.</p>
<p>Inlined by the compiler.</p>
<h2 id="spawn/3-examples" class="section-heading">
  <a href="#spawn/3-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="n">spawn</span><span class="p" data-group-id="0840997044-1">(</span><span class="nc">SomeModule</span><span class="p">,</span><span class="w"> </span><span class="ss">:function</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="0840997044-2">[</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p" data-group-id="0840997044-2">]</span><span class="p" data-group-id="0840997044-1">)</span></code></pre>
  </section>
</div>
<div class="detail" id="spawn_link/1">
    <div class="detail-header">
    <a href="#spawn_link/1" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">spawn_link(fun)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L905" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>spawn_link((() -> <a href="typespecs.html#basic-types">any</a>())) :: <a href="typespecs.html#basic-types">pid</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Spawns the given function, links it to the current process, and returns its PID.</p>
<p>Typically developers do not use the <code class="inline">spawn</code> functions, instead they use
abstractions such as <a href="Task.html"><code class="inline">Task</code></a>, <a href="GenServer.html"><code class="inline">GenServer</code></a> and <a href="Agent.html"><code class="inline">Agent</code></a>, built on top of
<code class="inline">spawn</code>, that spawns processes with more conveniences in terms of
introspection and debugging.</p>
<p>Check the <a href="Process.html"><code class="inline">Process</code></a> module for more process-related functions. For more
information on linking, check <a href="Process.html#link/1"><code class="inline">Process.link/1</code></a>.</p>
<p>The anonymous function receives 0 arguments, and may return any value.</p>
<p>Inlined by the compiler.</p>
<h2 id="spawn_link/1-examples" class="section-heading">
  <a href="#spawn_link/1-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="n">current</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">self</span><span class="p" data-group-id="3760145372-1">(</span><span class="p" data-group-id="3760145372-1">)</span><span class="w">
</span><span class="n">child</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">spawn_link</span><span class="p" data-group-id="3760145372-2">(</span><span class="k" data-group-id="3760145372-3">fn</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">send</span><span class="p" data-group-id="3760145372-4">(</span><span class="n">current</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="3760145372-5">{</span><span class="n">self</span><span class="p" data-group-id="3760145372-6">(</span><span class="p" data-group-id="3760145372-6">)</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">2</span><span class="p" data-group-id="3760145372-5">}</span><span class="p" data-group-id="3760145372-4">)</span><span class="w"> </span><span class="k" data-group-id="3760145372-3">end</span><span class="p" data-group-id="3760145372-2">)</span><span class="w">

</span><span class="k">receive</span><span class="w"> </span><span class="k" data-group-id="3760145372-7">do</span><span class="w">
  </span><span class="p" data-group-id="3760145372-8">{</span><span class="o">^</span><span class="n">child</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p" data-group-id="3760145372-8">}</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="nc">IO</span><span class="o">.</span><span class="n">puts</span><span class="w"> </span><span class="s">&quot;Received 3 back&quot;</span><span class="w">
</span><span class="k" data-group-id="3760145372-7">end</span></code></pre>
  </section>
</div>
<div class="detail" id="spawn_link/3">
    <div class="detail-header">
    <a href="#spawn_link/3" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">spawn_link(module, fun, args)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L929" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>spawn_link(<a href="typespecs.html#built-in-types">module</a>(), <a href="typespecs.html#basic-types">atom</a>(), <a href="typespecs.html#built-in-types">list</a>()) :: <a href="typespecs.html#basic-types">pid</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Spawns the given function <code class="inline">fun</code> from the given <code class="inline">module</code> passing it the given
<code class="inline">args</code>, links it to the current process, and returns its PID.</p>
<p>Typically developers do not use the <code class="inline">spawn</code> functions, instead they use
abstractions such as <a href="Task.html"><code class="inline">Task</code></a>, <a href="GenServer.html"><code class="inline">GenServer</code></a> and <a href="Agent.html"><code class="inline">Agent</code></a>, built on top of
<code class="inline">spawn</code>, that spawns processes with more conveniences in terms of
introspection and debugging.</p>
<p>Check the <a href="Process.html"><code class="inline">Process</code></a> module for more process-related functions. For more
information on linking, check <a href="Process.html#link/1"><code class="inline">Process.link/1</code></a>.</p>
<p>Inlined by the compiler.</p>
<h2 id="spawn_link/3-examples" class="section-heading">
  <a href="#spawn_link/3-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="n">spawn_link</span><span class="p" data-group-id="6615283205-1">(</span><span class="nc">SomeModule</span><span class="p">,</span><span class="w"> </span><span class="ss">:function</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="6615283205-2">[</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p" data-group-id="6615283205-2">]</span><span class="p" data-group-id="6615283205-1">)</span></code></pre>
  </section>
</div>
<div class="detail" id="spawn_monitor/1">
    <div class="detail-header">
    <a href="#spawn_monitor/1" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">spawn_monitor(fun)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L955" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>spawn_monitor((() -> <a href="typespecs.html#basic-types">any</a>())) :: {<a href="typespecs.html#basic-types">pid</a>(), <a href="typespecs.html#basic-types">reference</a>()}</pre>
      </div>
  </div>
  <section class="docstring">
<p>Spawns the given function, monitors it and returns its PID
and monitoring reference.</p>
<p>Typically developers do not use the <code class="inline">spawn</code> functions, instead they use
abstractions such as <a href="Task.html"><code class="inline">Task</code></a>, <a href="GenServer.html"><code class="inline">GenServer</code></a> and <a href="Agent.html"><code class="inline">Agent</code></a>, built on top of
<code class="inline">spawn</code>, that spawns processes with more conveniences in terms of
introspection and debugging.</p>
<p>Check the <a href="Process.html"><code class="inline">Process</code></a> module for more process-related functions.</p>
<p>The anonymous function receives 0 arguments, and may return any value.</p>
<p>Inlined by the compiler.</p>
<h2 id="spawn_monitor/1-examples" class="section-heading">
  <a href="#spawn_monitor/1-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="n">current</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">self</span><span class="p" data-group-id="8641258344-1">(</span><span class="p" data-group-id="8641258344-1">)</span><span class="w">
</span><span class="n">spawn_monitor</span><span class="p" data-group-id="8641258344-2">(</span><span class="k" data-group-id="8641258344-3">fn</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">send</span><span class="w"> </span><span class="n">current</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="8641258344-4">{</span><span class="n">self</span><span class="p" data-group-id="8641258344-5">(</span><span class="p" data-group-id="8641258344-5">)</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">2</span><span class="p" data-group-id="8641258344-4">}</span><span class="w"> </span><span class="k" data-group-id="8641258344-3">end</span><span class="p" data-group-id="8641258344-2">)</span></code></pre>
  </section>
</div>
<div class="detail" id="spawn_monitor/3">
    <div class="detail-header">
    <a href="#spawn_monitor/3" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">spawn_monitor(module, fun, args)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L978" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>spawn_monitor(<a href="typespecs.html#built-in-types">module</a>(), <a href="typespecs.html#basic-types">atom</a>(), <a href="typespecs.html#built-in-types">list</a>()) :: {<a href="typespecs.html#basic-types">pid</a>(), <a href="typespecs.html#basic-types">reference</a>()}</pre>
      </div>
  </div>
  <section class="docstring">
<p>Spawns the given module and function passing the given args,
monitors it and returns its PID and monitoring reference.</p>
<p>Typically developers do not use the <code class="inline">spawn</code> functions, instead they use
abstractions such as <a href="Task.html"><code class="inline">Task</code></a>, <a href="GenServer.html"><code class="inline">GenServer</code></a> and <a href="Agent.html"><code class="inline">Agent</code></a>, built on top of
<code class="inline">spawn</code>, that spawns processes with more conveniences in terms of
introspection and debugging.</p>
<p>Check the <a href="Process.html"><code class="inline">Process</code></a> module for more process-related functions.</p>
<p>Inlined by the compiler.</p>
<h2 id="spawn_monitor/3-examples" class="section-heading">
  <a href="#spawn_monitor/3-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="n">spawn_monitor</span><span class="p" data-group-id="4119111576-1">(</span><span class="nc">SomeModule</span><span class="p">,</span><span class="w"> </span><span class="ss">:function</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="4119111576-2">[</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p" data-group-id="4119111576-2">]</span><span class="p" data-group-id="4119111576-1">)</span></code></pre>
  </section>
</div>
<div class="detail" id="struct!/2">
  
    <span id="struct!/1"></span>
  <div class="detail-header">
    <a href="#struct!/2" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">struct!(struct, fields \\ [])</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L2013" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>struct!(<a href="typespecs.html#built-in-types">module</a>() | <a href="typespecs.html#basic-types">struct</a>(), <a href="Enum.html#t:t/0">Enum.t</a>()) :: <a href="typespecs.html#basic-types">struct</a>() | <a href="typespecs.html#built-in-types">no_return</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Similar to <a href="#struct/2"><code class="inline">struct/2</code></a> but checks for key validity.</p>
<p>The function <a href="#struct!/2"><code class="inline">struct!/2</code></a> emulates the compile time behaviour
of structs. This means that:</p>
<ul>
<li><p>when building a struct, as in <code class="inline">struct!(SomeStruct, key: :value)</code>,
it is equivalent to <code class="inline">%SomeStruct{key: :value}</code> and therefore this
function will check if every given key-value belongs to the struct.
If the struct is enforcing any key via <code class="inline">@enforce_keys</code>, those will
be enforced as well;</p>
</li>
<li><p>when updating a struct, as in <code class="inline">struct!(%SomeStruct{}, key: :value)</code>,
it is equivalent to <code class="inline">%SomeStruct{struct | key: :value}</code> and therefore this
function will check if every given key-value belongs to the struct.
However, updating structs does not enforce keys, as keys are enforced
only when building;</p>
</li>
</ul>
  </section>
</div>
<div class="detail" id="struct/2">
  
    <span id="struct/1"></span>
  <div class="detail-header">
    <a href="#struct/2" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">struct(struct, fields \\ [])</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L1974" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>struct(<a href="typespecs.html#built-in-types">module</a>() | <a href="typespecs.html#basic-types">struct</a>(), <a href="Enum.html#t:t/0">Enum.t</a>()) :: <a href="typespecs.html#basic-types">struct</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Creates and updates structs.</p>
<p>The <code class="inline">struct</code> argument may be an atom (which defines <code class="inline">defstruct</code>)
or a <code class="inline">struct</code> itself. The second argument is any <a href="Enumerable.html"><code class="inline">Enumerable</code></a> that
emits two-element tuples (key-value pairs) during enumeration.</p>
<p>Keys in the <a href="Enumerable.html"><code class="inline">Enumerable</code></a> that don’t exist in the struct are automatically
discarded. Note that keys must be atoms, as only atoms are allowed when
defining a struct.</p>
<p>This function is useful for dynamically creating and updating structs, as
well as for converting maps to structs; in the latter case, just inserting
the appropriate <code class="inline">:__struct__</code> field into the map may not be enough and
<a href="#struct/2"><code class="inline">struct/2</code></a> should be used instead.</p>
<h2 id="struct/2-examples" class="section-heading">
  <a href="#struct/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="kd">defmodule</span><span class="w"> </span><span class="nc">User</span><span class="w"> </span><span class="k" data-group-id="1549345813-1">do</span><span class="w">
  </span><span class="kd">defstruct</span><span class="w"> </span><span class="ss">name</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;john&quot;</span><span class="w">
</span><span class="k" data-group-id="1549345813-1">end</span><span class="w">

</span><span class="n">struct</span><span class="p" data-group-id="1549345813-2">(</span><span class="nc">User</span><span class="p" data-group-id="1549345813-2">)</span><span class="w">
</span><span class="c1">#=&gt; %User{name: &quot;john&quot;}</span><span class="w">

</span><span class="n">opts</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p" data-group-id="1549345813-3">[</span><span class="ss">name</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;meg&quot;</span><span class="p" data-group-id="1549345813-3">]</span><span class="w">
</span><span class="n">user</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">struct</span><span class="p" data-group-id="1549345813-4">(</span><span class="nc">User</span><span class="p">,</span><span class="w"> </span><span class="n">opts</span><span class="p" data-group-id="1549345813-4">)</span><span class="w">
</span><span class="c1">#=&gt; %User{name: &quot;meg&quot;}</span><span class="w">

</span><span class="n">struct</span><span class="p" data-group-id="1549345813-5">(</span><span class="n">user</span><span class="p">,</span><span class="w"> </span><span class="ss">unknown</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;value&quot;</span><span class="p" data-group-id="1549345813-5">)</span><span class="w">
</span><span class="c1">#=&gt; %User{name: &quot;meg&quot;}</span><span class="w">

</span><span class="n">struct</span><span class="p" data-group-id="1549345813-6">(</span><span class="nc">User</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="1549345813-7">%{</span><span class="ss">name</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;meg&quot;</span><span class="p" data-group-id="1549345813-7">}</span><span class="p" data-group-id="1549345813-6">)</span><span class="w">
</span><span class="c1">#=&gt; %User{name: &quot;meg&quot;}</span><span class="w">

</span><span class="c1"># String keys are ignored</span><span class="w">
</span><span class="n">struct</span><span class="p" data-group-id="1549345813-8">(</span><span class="nc">User</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="1549345813-9">%{</span><span class="s">&quot;name&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="s">&quot;meg&quot;</span><span class="p" data-group-id="1549345813-9">}</span><span class="p" data-group-id="1549345813-8">)</span><span class="w">
</span><span class="c1">#=&gt; %User{name: &quot;john&quot;}</span></code></pre>
  </section>
</div>
<div class="detail" id="throw/1">
    <div class="detail-header">
    <a href="#throw/1" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">throw(term)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L990" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>throw(<a href="typespecs.html#built-in-types">term</a>()) :: <a href="typespecs.html#built-in-types">no_return</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>A non-local return from a function.</p>
<p>Check <a href="Kernel.SpecialForms.html#try/1"><code class="inline">Kernel.SpecialForms.try/1</code></a> for more information.</p>
<p>Inlined by the compiler.</p>
  </section>
</div>
<div class="detail" id="tl/1">
    <div class="detail-header">
    <a href="#tl/1" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">tl(list)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L1021" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>tl(nonempty_maybe_improper_list(elem, tail)) ::
  <a href="typespecs.html#basic-types">maybe_improper_list</a>(elem, tail) | tail
when elem: <a href="typespecs.html#built-in-types">term</a>(), tail: <a href="typespecs.html#built-in-types">term</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Returns the tail of a list. Raises <a href="ArgumentError.html"><code class="inline">ArgumentError</code></a> if the list is empty.</p>
<p>It works with improper lists.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
<h2 id="tl/1-examples" class="section-heading">
  <a href="#tl/1-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="n">tl</span><span class="p" data-group-id="9028473023-1">(</span><span class="p" data-group-id="9028473023-2">[</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="ss">:go</span><span class="p" data-group-id="9028473023-2">]</span><span class="p" data-group-id="9028473023-1">)</span><span class="w">
</span><span class="c1">#=&gt; [2, 3, :go]</span><span class="w">

</span><span class="n">tl</span><span class="p" data-group-id="9028473023-3">(</span><span class="p" data-group-id="9028473023-4">[</span><span class="p" data-group-id="9028473023-4">]</span><span class="p" data-group-id="9028473023-3">)</span><span class="w">
</span><span class="c1">#=&gt; ** (ArgumentError) argument error</span><span class="w">

</span><span class="n">tl</span><span class="p" data-group-id="9028473023-5">(</span><span class="p" data-group-id="9028473023-6">[</span><span class="ss">:one</span><span class="p" data-group-id="9028473023-6">]</span><span class="p" data-group-id="9028473023-5">)</span><span class="w">
</span><span class="c1">#=&gt; []</span><span class="w">

</span><span class="n">tl</span><span class="p" data-group-id="9028473023-7">(</span><span class="p" data-group-id="9028473023-8">[</span><span class="ss">:a</span><span class="p">,</span><span class="w"> </span><span class="ss">:b</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="ss">:c</span><span class="p" data-group-id="9028473023-8">]</span><span class="p" data-group-id="9028473023-7">)</span><span class="w">
</span><span class="c1">#=&gt; [:b | :c]</span><span class="w">

</span><span class="n">tl</span><span class="p" data-group-id="9028473023-9">(</span><span class="p" data-group-id="9028473023-10">[</span><span class="ss">:a</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="p" data-group-id="9028473023-11">%{</span><span class="ss">b</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p" data-group-id="9028473023-11">}</span><span class="p" data-group-id="9028473023-10">]</span><span class="p" data-group-id="9028473023-9">)</span><span class="w">
</span><span class="c1">#=&gt; %{b: 1}</span></code></pre>
  </section>
</div>
<div class="detail" id="to_charlist/1">
    <div class="detail-header">
    <a href="#to_charlist/1" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">to_charlist(term)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L2573" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Converts the given term to a charlist according to the <a href="List.Chars.html"><code class="inline">List.Chars</code></a> protocol.</p>
<h2 id="to_charlist/1-examples" class="section-heading">
  <a href="#to_charlist/1-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">to_charlist</span><span class="p" data-group-id="8124105205-1">(</span><span class="ss">:foo</span><span class="p" data-group-id="8124105205-1">)</span><span class="w">
</span><span class="sc">&#39;foo&#39;</span></code></pre>
  </section>
</div>
<div class="detail" id="to_string/1">
    <div class="detail-header">
    <a href="#to_string/1" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">to_string(term)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L2560" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Converts the argument to a string according to the
<a href="String.Chars.html"><code class="inline">String.Chars</code></a> protocol.</p>
<p>This is the function invoked when there is string interpolation.</p>
<h2 id="to_string/1-examples" class="section-heading">
  <a href="#to_string/1-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">to_string</span><span class="p" data-group-id="3747696803-1">(</span><span class="ss">:foo</span><span class="p" data-group-id="3747696803-1">)</span><span class="w">
</span><span class="s">&quot;foo&quot;</span></code></pre>
  </section>
</div>
<div class="detail" id="trunc/1">
    <div class="detail-header">
    <a href="#trunc/1" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">trunc(number)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L1044" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>trunc(value) :: value when value: <a href="typespecs.html#basic-types">integer</a>()</pre>
          <pre>trunc(<a href="typespecs.html#basic-types">float</a>()) :: <a href="typespecs.html#basic-types">integer</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Returns the integer part of <code class="inline">number</code>.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
<h2 id="trunc/1-examples" class="section-heading">
  <a href="#trunc/1-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">trunc</span><span class="p" data-group-id="5980774128-1">(</span><span class="mf">5.4</span><span class="p" data-group-id="5980774128-1">)</span><span class="w">
</span><span class="mi">5</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="n">trunc</span><span class="p" data-group-id="5980774128-2">(</span><span class="o">-</span><span class="mf">5.99</span><span class="p" data-group-id="5980774128-2">)</span><span class="w">
</span><span class="o">-</span><span class="mi">5</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="n">trunc</span><span class="p" data-group-id="5980774128-3">(</span><span class="o">-</span><span class="mi">5</span><span class="p" data-group-id="5980774128-3">)</span><span class="w">
</span><span class="o">-</span><span class="mi">5</span></code></pre>
  </section>
</div>
<div class="detail" id="tuple_size/1">
    <div class="detail-header">
    <a href="#tuple_size/1" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">tuple_size(tuple)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L1062" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>tuple_size(<a href="typespecs.html#basic-types">tuple</a>()) :: <a href="typespecs.html#basic-types">non_neg_integer</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Returns the size of a tuple.</p>
<p>This operation happens in constant time.</p>
<p>Allowed in guard tests. Inlined by the compiler.</p>
<h2 id="tuple_size/1-examples" class="section-heading">
  <a href="#tuple_size/1-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">tuple_size</span><span class="p" data-group-id="9956417651-1">(</span><span class="p" data-group-id="9956417651-2">{</span><span class="ss">:a</span><span class="p">,</span><span class="w"> </span><span class="ss">:b</span><span class="p">,</span><span class="w"> </span><span class="ss">:c</span><span class="p" data-group-id="9956417651-2">}</span><span class="p" data-group-id="9956417651-1">)</span><span class="w">
</span><span class="mi">3</span></code></pre>
  </section>
</div>
<div class="detail" id="unless/2">
    <div class="detail-header">
    <a href="#unless/2" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">unless(condition, clauses)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L2949" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Provides an <code class="inline">unless</code> macro.</p>
<p>This macro evaluates and returns the <code class="inline">do</code> block passed in as the second
argument unless <code class="inline">clause</code> evaluates to <code class="inline">true</code>. Otherwise, it returns the value
of the <code class="inline">else</code> block if present or <code class="inline">nil</code> if not.</p>
<p>See also <a href="#if/2"><code class="inline">if/2</code></a>.</p>
<h2 id="unless/2-examples" class="section-heading">
  <a href="#unless/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="k">unless</span><span class="p" data-group-id="6446851772-1">(</span><span class="nc">Enum</span><span class="o">.</span><span class="n">empty?</span><span class="p" data-group-id="6446851772-2">(</span><span class="p" data-group-id="6446851772-3">[</span><span class="p" data-group-id="6446851772-3">]</span><span class="p" data-group-id="6446851772-2">)</span><span class="p">,</span><span class="w"> </span><span class="ss">do</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;Hello&quot;</span><span class="p" data-group-id="6446851772-1">)</span><span class="w">
</span><span class="no">nil</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="k">unless</span><span class="p" data-group-id="6446851772-4">(</span><span class="nc">Enum</span><span class="o">.</span><span class="n">empty?</span><span class="p" data-group-id="6446851772-5">(</span><span class="p" data-group-id="6446851772-6">[</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p" data-group-id="6446851772-6">]</span><span class="p" data-group-id="6446851772-5">)</span><span class="p">,</span><span class="w"> </span><span class="ss">do</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;Hello&quot;</span><span class="p" data-group-id="6446851772-4">)</span><span class="w">
</span><span class="s">&quot;Hello&quot;</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="k">unless</span><span class="w"> </span><span class="nc">Enum</span><span class="o">.</span><span class="n">sum</span><span class="p" data-group-id="6446851772-7">(</span><span class="p" data-group-id="6446851772-8">[</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p" data-group-id="6446851772-8">]</span><span class="p" data-group-id="6446851772-7">)</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="k" data-group-id="6446851772-9">do</span><span class="w">
</span><span class="gp unselectable">...&gt; </span><span class="w">  </span><span class="s">&quot;Math still works&quot;</span><span class="w">
</span><span class="gp unselectable">...&gt; </span><span class="k" data-group-id="6446851772-9">else</span><span class="w">
</span><span class="gp unselectable">...&gt; </span><span class="w">  </span><span class="s">&quot;Math is broken&quot;</span><span class="w">
</span><span class="gp unselectable">...&gt; </span><span class="k" data-group-id="6446851772-9">end</span><span class="w">
</span><span class="s">&quot;Math still works&quot;</span></code></pre>
  </section>
</div>
<div class="detail" id="update_in/2">
    <div class="detail-header">
    <a href="#update_in/2" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">update_in(path, fun)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L2368" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Updates a nested structure via the given <code class="inline">path</code>.</p>
<p>This is similar to <a href="#update_in/3"><code class="inline">update_in/3</code></a>, except the path is extracted via
a macro rather than passing a list. For example:</p>
<pre><code class="nohighlight makeup elixir"><span class="n">update_in</span><span class="p" data-group-id="2271039219-1">(</span><span class="n">opts</span><span class="p" data-group-id="2271039219-2">[</span><span class="ss">:foo</span><span class="p" data-group-id="2271039219-2">]</span><span class="p" data-group-id="2271039219-3">[</span><span class="ss">:bar</span><span class="p" data-group-id="2271039219-3">]</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="p" data-group-id="2271039219-4">(</span><span class="ni">&amp;1</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p" data-group-id="2271039219-4">)</span><span class="p" data-group-id="2271039219-1">)</span></code></pre>
<p>Is equivalent to:</p>
<pre><code class="nohighlight makeup elixir"><span class="n">update_in</span><span class="p" data-group-id="6991137780-1">(</span><span class="n">opts</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="6991137780-2">[</span><span class="ss">:foo</span><span class="p">,</span><span class="w"> </span><span class="ss">:bar</span><span class="p" data-group-id="6991137780-2">]</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="p" data-group-id="6991137780-3">(</span><span class="ni">&amp;1</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p" data-group-id="6991137780-3">)</span><span class="p" data-group-id="6991137780-1">)</span></code></pre>
<p>Note that in order for this macro to work, the complete path must always
be visible by this macro. For more information about the supported path
expressions, please check <a href="#get_and_update_in/2"><code class="inline">get_and_update_in/2</code></a> docs.</p>
<h2 id="update_in/2-examples" class="section-heading">
  <a href="#update_in/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">users</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p" data-group-id="3880075748-1">%{</span><span class="s">&quot;john&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="3880075748-2">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">27</span><span class="p" data-group-id="3880075748-2">}</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;meg&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="3880075748-3">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">23</span><span class="p" data-group-id="3880075748-3">}</span><span class="p" data-group-id="3880075748-1">}</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="n">update_in</span><span class="p" data-group-id="3880075748-4">(</span><span class="n">users</span><span class="p" data-group-id="3880075748-5">[</span><span class="s">&quot;john&quot;</span><span class="p" data-group-id="3880075748-5">]</span><span class="p" data-group-id="3880075748-6">[</span><span class="ss">:age</span><span class="p" data-group-id="3880075748-6">]</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="p" data-group-id="3880075748-7">(</span><span class="ni">&amp;1</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p" data-group-id="3880075748-7">)</span><span class="p" data-group-id="3880075748-4">)</span><span class="w">
</span><span class="p" data-group-id="3880075748-8">%{</span><span class="s">&quot;john&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="3880075748-9">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">28</span><span class="p" data-group-id="3880075748-9">}</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;meg&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="3880075748-10">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">23</span><span class="p" data-group-id="3880075748-10">}</span><span class="p" data-group-id="3880075748-8">}</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="n">users</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p" data-group-id="3880075748-11">%{</span><span class="s">&quot;john&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="3880075748-12">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">27</span><span class="p" data-group-id="3880075748-12">}</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;meg&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="3880075748-13">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">23</span><span class="p" data-group-id="3880075748-13">}</span><span class="p" data-group-id="3880075748-11">}</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="n">update_in</span><span class="p" data-group-id="3880075748-14">(</span><span class="n">users</span><span class="p" data-group-id="3880075748-15">[</span><span class="s">&quot;john&quot;</span><span class="p" data-group-id="3880075748-15">]</span><span class="o">.</span><span class="n">age</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="p" data-group-id="3880075748-16">(</span><span class="ni">&amp;1</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p" data-group-id="3880075748-16">)</span><span class="p" data-group-id="3880075748-14">)</span><span class="w">
</span><span class="p" data-group-id="3880075748-17">%{</span><span class="s">&quot;john&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="3880075748-18">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">28</span><span class="p" data-group-id="3880075748-18">}</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;meg&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="3880075748-19">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">23</span><span class="p" data-group-id="3880075748-19">}</span><span class="p" data-group-id="3880075748-17">}</span></code></pre>
  </section>
</div>
<div class="detail" id="update_in/3">
    <div class="detail-header">
    <a href="#update_in/3" class="detail-link" title="Link to this function">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this function</span>
    </a>
    <span class="signature">update_in(data, keys, fun)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L2135" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
        
      <div class="specs">
          <pre>update_in(<a href="Access.html#t:t/0">Access.t</a>(), [<a href="typespecs.html#built-in-types">term</a>(), ...], (<a href="typespecs.html#built-in-types">term</a>() -> <a href="typespecs.html#built-in-types">term</a>())) :: <a href="Access.html#t:t/0">Access.t</a>()</pre>
      </div>
  </div>
  <section class="docstring">
<p>Updates a key in a nested structure.</p>
<p>Uses the <a href="Access.html"><code class="inline">Access</code></a> module to traverse the structures
according to the given <code class="inline">keys</code>, unless the <code class="inline">key</code> is a
function. If the key is a function, it will be invoked
as specified in <a href="#get_and_update_in/3"><code class="inline">get_and_update_in/3</code></a>.</p>
<h2 id="update_in/3-examples" class="section-heading">
  <a href="#update_in/3-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="n">users</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p" data-group-id="1561715857-1">%{</span><span class="s">&quot;john&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="1561715857-2">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">27</span><span class="p" data-group-id="1561715857-2">}</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;meg&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="1561715857-3">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">23</span><span class="p" data-group-id="1561715857-3">}</span><span class="p" data-group-id="1561715857-1">}</span><span class="w">
</span><span class="gp unselectable">iex&gt; </span><span class="n">update_in</span><span class="p" data-group-id="1561715857-4">(</span><span class="n">users</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="1561715857-5">[</span><span class="s">&quot;john&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">:age</span><span class="p" data-group-id="1561715857-5">]</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="p" data-group-id="1561715857-6">(</span><span class="ni">&amp;1</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p" data-group-id="1561715857-6">)</span><span class="p" data-group-id="1561715857-4">)</span><span class="w">
</span><span class="p" data-group-id="1561715857-7">%{</span><span class="s">&quot;john&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="1561715857-8">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">28</span><span class="p" data-group-id="1561715857-8">}</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;meg&quot;</span><span class="w"> </span><span class="o">=</span><span class="o">&gt;</span><span class="w"> </span><span class="p" data-group-id="1561715857-9">%{</span><span class="ss">age</span><span class="p">:</span><span class="w"> </span><span class="mi">23</span><span class="p" data-group-id="1561715857-9">}</span><span class="p" data-group-id="1561715857-7">}</span></code></pre>
<p>In case any of the entries in the middle returns <code class="inline">nil</code>,
an error will be raised when trying to access it next.</p>
  </section>
</div>
<div class="detail" id="use/2">
  
    <span id="use/1"></span>
  <div class="detail-header">
    <a href="#use/2" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">use(module, opts \\ [])</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L4796" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Uses the given module in the current context.</p>
<p>When calling:</p>
<pre><code class="nohighlight makeup elixir"><span class="kn">use</span><span class="w"> </span><span class="nc">MyModule</span><span class="p">,</span><span class="w"> </span><span class="ss">some</span><span class="p">:</span><span class="w"> </span><span class="ss">:options</span></code></pre>
<p>the <code class="inline">__using__/1</code> macro from the <code class="inline">MyModule</code> module is invoked with the second
argument passed to <code class="inline">use</code> as its argument. Since <code class="inline">__using__/1</code> is a macro, all
the usual macro rules apply, and its return value should be quoted code
that is then inserted where <a href="#use/2"><code class="inline">use/2</code></a> is called.</p>
<h2 id="use/2-examples" class="section-heading">
  <a href="#use/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<p>For example, in order to write test cases using the <code class="inline">ExUnit</code> framework
provided with Elixir, a developer should <code class="inline">use</code> the <code class="inline">ExUnit.Case</code> module:</p>
<pre><code class="nohighlight makeup elixir"><span class="kd">defmodule</span><span class="w"> </span><span class="nc">AssertionTest</span><span class="w"> </span><span class="k" data-group-id="9305956941-1">do</span><span class="w">
  </span><span class="kn">use</span><span class="w"> </span><span class="nc">ExUnit.Case</span><span class="p">,</span><span class="w"> </span><span class="ss">async</span><span class="p">:</span><span class="w"> </span><span class="no">true</span><span class="w">

  </span><span class="n">test</span><span class="w"> </span><span class="s">&quot;always pass&quot;</span><span class="w"> </span><span class="k" data-group-id="9305956941-2">do</span><span class="w">
    </span><span class="n">assert</span><span class="w"> </span><span class="no">true</span><span class="w">
  </span><span class="k" data-group-id="9305956941-2">end</span><span class="w">
</span><span class="k" data-group-id="9305956941-1">end</span></code></pre>
<p>In this example, <code class="inline">ExUnit.Case.__using__/1</code> is called with the keyword list
<code class="inline">[async: true]</code> as its argument; <a href="#use/2"><code class="inline">use/2</code></a> translates to:</p>
<pre><code class="nohighlight makeup elixir"><span class="kd">defmodule</span><span class="w"> </span><span class="nc">AssertionTest</span><span class="w"> </span><span class="k" data-group-id="4573350590-1">do</span><span class="w">
  </span><span class="kn">require</span><span class="w"> </span><span class="nc">ExUnit.Case</span><span class="w">
  </span><span class="nc">ExUnit.Case</span><span class="o">.</span><span class="c">__using__</span><span class="p" data-group-id="4573350590-2">(</span><span class="p" data-group-id="4573350590-3">[</span><span class="ss">async</span><span class="p">:</span><span class="w"> </span><span class="no">true</span><span class="p" data-group-id="4573350590-3">]</span><span class="p" data-group-id="4573350590-2">)</span><span class="w">

  </span><span class="n">test</span><span class="w"> </span><span class="s">&quot;always pass&quot;</span><span class="w"> </span><span class="k" data-group-id="4573350590-4">do</span><span class="w">
    </span><span class="n">assert</span><span class="w"> </span><span class="no">true</span><span class="w">
  </span><span class="k" data-group-id="4573350590-4">end</span><span class="w">
</span><span class="k" data-group-id="4573350590-1">end</span></code></pre>
<p><code class="inline">ExUnit.Case</code> will then define the <code class="inline">__using__/1</code> macro:</p>
<pre><code class="nohighlight makeup elixir"><span class="kd">defmodule</span><span class="w"> </span><span class="nc">ExUnit.Case</span><span class="w"> </span><span class="k" data-group-id="2836147720-1">do</span><span class="w">
  </span><span class="kd">defmacro</span><span class="w"> </span><span class="nf">__using__</span><span class="p" data-group-id="2836147720-2">(</span><span class="n">opts</span><span class="p" data-group-id="2836147720-2">)</span><span class="w"> </span><span class="k" data-group-id="2836147720-3">do</span><span class="w">
    </span><span class="c1"># do something with opts</span><span class="w">
    </span><span class="k">quote</span><span class="w"> </span><span class="k" data-group-id="2836147720-4">do</span><span class="w">
      </span><span class="c1"># return some code to inject in the caller</span><span class="w">
    </span><span class="k" data-group-id="2836147720-4">end</span><span class="w">
  </span><span class="k" data-group-id="2836147720-3">end</span><span class="w">
</span><span class="k" data-group-id="2836147720-1">end</span></code></pre>
<h2 id="use/2-best-practices" class="section-heading">
  <a href="#use/2-best-practices" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Best practices
</h2>

<p><code class="inline">__using__/1</code> is typically used when there is a need to set some state (via
module attributes) or callbacks (like <code class="inline">@before_compile</code>, see the documentation
for <a href="Module.html"><code class="inline">Module</code></a> for more information) into the caller.</p>
<p><code class="inline">__using__/1</code> may also be used to alias, require, or import functionality
from different modules:</p>
<pre><code class="nohighlight makeup elixir"><span class="kd">defmodule</span><span class="w"> </span><span class="nc">MyModule</span><span class="w"> </span><span class="k" data-group-id="7704182116-1">do</span><span class="w">
  </span><span class="kd">defmacro</span><span class="w"> </span><span class="nf">__using__</span><span class="p" data-group-id="7704182116-2">(</span><span class="c">_opts</span><span class="p" data-group-id="7704182116-2">)</span><span class="w"> </span><span class="k" data-group-id="7704182116-3">do</span><span class="w">
    </span><span class="k">quote</span><span class="w"> </span><span class="k" data-group-id="7704182116-4">do</span><span class="w">
      </span><span class="kn">import</span><span class="w"> </span><span class="nc">MyModule.Foo</span><span class="w">
      </span><span class="kn">import</span><span class="w"> </span><span class="nc">MyModule.Bar</span><span class="w">
      </span><span class="kn">import</span><span class="w"> </span><span class="nc">MyModule.Baz</span><span class="w">

      </span><span class="kn">alias</span><span class="w"> </span><span class="nc">MyModule.Repo</span><span class="w">
    </span><span class="k" data-group-id="7704182116-4">end</span><span class="w">
  </span><span class="k" data-group-id="7704182116-3">end</span><span class="w">
</span><span class="k" data-group-id="7704182116-1">end</span></code></pre>
<p>However, do not provide <code class="inline">__using__/1</code> if all it does is to import,
alias or require the module itself. For example, avoid this:</p>
<pre><code class="nohighlight makeup elixir"><span class="kd">defmodule</span><span class="w"> </span><span class="nc">MyModule</span><span class="w"> </span><span class="k" data-group-id="8987489231-1">do</span><span class="w">
  </span><span class="kd">defmacro</span><span class="w"> </span><span class="nf">__using__</span><span class="p" data-group-id="8987489231-2">(</span><span class="c">_opts</span><span class="p" data-group-id="8987489231-2">)</span><span class="w"> </span><span class="k" data-group-id="8987489231-3">do</span><span class="w">
    </span><span class="k">quote</span><span class="w"> </span><span class="k" data-group-id="8987489231-4">do</span><span class="w">
      </span><span class="kn">import</span><span class="w"> </span><span class="nc">MyModule</span><span class="w">
    </span><span class="k" data-group-id="8987489231-4">end</span><span class="w">
  </span><span class="k" data-group-id="8987489231-3">end</span><span class="w">
</span><span class="k" data-group-id="8987489231-1">end</span></code></pre>
<p>In such cases, developers should instead import or alias the module
directly, so that they can customize those as they wish,
without the indirection behind <a href="#use/2"><code class="inline">use/2</code></a>.</p>
<p>Finally, developers should also avoid defining functions inside
the <code class="inline">__using__/1</code> callback, unless those functions are the default
implementation of a previously defined <code class="inline">@callback</code> or are functions
meant to be overridden (see <a href="#defoverridable/1"><code class="inline">defoverridable/1</code></a>). Even in these cases,
defining functions should be seen as a “last resort”.</p>
<p>In case you want to provide some existing functionality to the user module,
please define it in a module which will be imported accordingly; for example,
<code class="inline">ExUnit.Case</code> doesn’t define the <code class="inline">test/3</code> macro in the module that calls
<code class="inline">use ExUnit.Case</code>, but it defines <code class="inline">ExUnit.Case.test/3</code> and just imports that
into the caller when used.</p>
  </section>
</div>
<div class="detail" id="var!/2">
  
    <span id="var!/1"></span>
  <div class="detail-header">
    <a href="#var!/2" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">var!(var, context \\ nil)</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L3561" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>When used inside quoting, marks that the given variable should
not be hygienized.</p>
<p>The argument can be either a variable unquoted or in standard tuple form
<code class="inline">{name, meta, context}</code>.</p>
<p>Check <a href="Kernel.SpecialForms.html#quote/2"><code class="inline">Kernel.SpecialForms.quote/2</code></a> for more information.</p>
  </section>
</div>
<div class="detail" id="%7C%3E/2">
    <span id="|&gt;/2"></span>
    <div class="detail-header">
    <a href="#%7C%3E/2" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">left |&gt; right</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L3206" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Pipe operator.</p>
<p>This operator introduces the expression on the left-hand side as
the first argument to the function call on the right-hand side.</p>
<h2 id="%7C%3E/2-examples" class="section-heading">
  <a href="#%7C%3E/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="p" data-group-id="9189059769-1">[</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="9189059769-2">[</span><span class="mi">2</span><span class="p" data-group-id="9189059769-2">]</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p" data-group-id="9189059769-1">]</span><span class="w"> </span><span class="o">|&gt;</span><span class="w"> </span><span class="nc">List</span><span class="o">.</span><span class="n">flatten</span><span class="p" data-group-id="9189059769-3">(</span><span class="p" data-group-id="9189059769-3">)</span><span class="w">
</span><span class="p" data-group-id="9189059769-4">[</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p" data-group-id="9189059769-4">]</span></code></pre>
<p>The example above is the same as calling <code class="inline">List.flatten([1, [2], 3])</code>.</p>
<p>The <code class="inline">|&gt;</code> operator is mostly useful when there is a desire to execute a series
of operations resembling a pipeline:</p>
<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="p" data-group-id="2202626933-1">[</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="2202626933-2">[</span><span class="mi">2</span><span class="p" data-group-id="2202626933-2">]</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p" data-group-id="2202626933-1">]</span><span class="w"> </span><span class="o">|&gt;</span><span class="w"> </span><span class="nc">List</span><span class="o">.</span><span class="n">flatten</span><span class="p" data-group-id="2202626933-3">(</span><span class="p" data-group-id="2202626933-3">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w"> </span><span class="nc">Enum</span><span class="o">.</span><span class="n">map</span><span class="p" data-group-id="2202626933-4">(</span><span class="k" data-group-id="2202626933-5">fn</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="k" data-group-id="2202626933-5">end</span><span class="p" data-group-id="2202626933-4">)</span><span class="w">
</span><span class="p" data-group-id="2202626933-6">[</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w"> </span><span class="mi">6</span><span class="p" data-group-id="2202626933-6">]</span></code></pre>
<p>In the example above, the list <code class="inline">[1, [2], 3]</code> is passed as the first argument
to the <a href="List.html#flatten/1"><code class="inline">List.flatten/1</code></a> function, then the flattened list is passed as the
first argument to the <a href="Enum.html#map/2"><code class="inline">Enum.map/2</code></a> function which doubles each element of the
list.</p>
<p>In other words, the expression above simply translates to:</p>
<pre><code class="nohighlight makeup elixir"><span class="nc">Enum</span><span class="o">.</span><span class="n">map</span><span class="p" data-group-id="9850541120-1">(</span><span class="nc">List</span><span class="o">.</span><span class="n">flatten</span><span class="p" data-group-id="9850541120-2">(</span><span class="p" data-group-id="9850541120-3">[</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="9850541120-4">[</span><span class="mi">2</span><span class="p" data-group-id="9850541120-4">]</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p" data-group-id="9850541120-3">]</span><span class="p" data-group-id="9850541120-2">)</span><span class="p">,</span><span class="w"> </span><span class="k" data-group-id="9850541120-5">fn</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="k" data-group-id="9850541120-5">end</span><span class="p" data-group-id="9850541120-1">)</span></code></pre>
<h2 id="%7C%3E/2-pitfalls" class="section-heading">
  <a href="#%7C%3E/2-pitfalls" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Pitfalls
</h2>

<p>There are two common pitfalls when using the pipe operator.</p>
<p>The first one is related to operator precedence. For example,
the following expression:</p>
<pre><code class="nohighlight makeup elixir"><span class="nc">String</span><span class="o">.</span><span class="n">graphemes</span><span class="w"> </span><span class="s">&quot;Hello&quot;</span><span class="w"> </span><span class="o">|&gt;</span><span class="w"> </span><span class="nc">Enum</span><span class="o">.</span><span class="n">reverse</span></code></pre>
<p>Translates to:</p>
<pre><code class="nohighlight makeup elixir"><span class="nc">String</span><span class="o">.</span><span class="n">graphemes</span><span class="p" data-group-id="5086790611-1">(</span><span class="s">&quot;Hello&quot;</span><span class="w"> </span><span class="o">|&gt;</span><span class="w"> </span><span class="nc">Enum</span><span class="o">.</span><span class="n">reverse</span><span class="p" data-group-id="5086790611-1">)</span></code></pre>
<p>which results in an error as the <a href="Enumerable.html"><code class="inline">Enumerable</code></a> protocol is not defined
for binaries. Adding explicit parentheses resolves the ambiguity:</p>
<pre><code class="nohighlight makeup elixir"><span class="nc">String</span><span class="o">.</span><span class="n">graphemes</span><span class="p" data-group-id="9040462820-1">(</span><span class="s">&quot;Hello&quot;</span><span class="p" data-group-id="9040462820-1">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w"> </span><span class="nc">Enum</span><span class="o">.</span><span class="n">reverse</span></code></pre>
<p>Or, even better:</p>
<pre><code class="nohighlight makeup elixir"><span class="s">&quot;Hello&quot;</span><span class="w"> </span><span class="o">|&gt;</span><span class="w"> </span><span class="nc">String</span><span class="o">.</span><span class="n">graphemes</span><span class="w"> </span><span class="o">|&gt;</span><span class="w"> </span><span class="nc">Enum</span><span class="o">.</span><span class="n">reverse</span></code></pre>
<p>The second pitfall is that the <code class="inline">|&gt;</code> operator works on calls.
For example, when you write:</p>
<pre><code class="nohighlight makeup elixir"><span class="s">&quot;Hello&quot;</span><span class="w"> </span><span class="o">|&gt;</span><span class="w"> </span><span class="n">some_function</span><span class="p" data-group-id="3051540489-1">(</span><span class="p" data-group-id="3051540489-1">)</span></code></pre>
<p>Elixir sees the right-hand side is a function call and pipes
to it. This means that, if you want to pipe to an anonymous
or captured function, it must also be explicitly called.</p>
<p>Given the anonymous function:</p>
<pre><code class="nohighlight makeup elixir"><span class="n">fun</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k" data-group-id="1283494715-1">fn</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="nc">IO</span><span class="o">.</span><span class="n">puts</span><span class="p" data-group-id="1283494715-2">(</span><span class="n">x</span><span class="p" data-group-id="1283494715-2">)</span><span class="w"> </span><span class="k" data-group-id="1283494715-1">end</span><span class="w">
</span><span class="n">fun</span><span class="o">.</span><span class="p" data-group-id="1283494715-3">(</span><span class="s">&quot;Hello&quot;</span><span class="p" data-group-id="1283494715-3">)</span></code></pre>
<p>This won’t work as it will rather try to invoke the local
function <code class="inline">fun</code>:</p>
<pre><code class="nohighlight makeup elixir"><span class="s">&quot;Hello&quot;</span><span class="w"> </span><span class="o">|&gt;</span><span class="w"> </span><span class="n">fun</span><span class="p" data-group-id="8530720282-1">(</span><span class="p" data-group-id="8530720282-1">)</span></code></pre>
<p>This works:</p>
<pre><code class="nohighlight makeup elixir"><span class="s">&quot;Hello&quot;</span><span class="w"> </span><span class="o">|&gt;</span><span class="w"> </span><span class="n">fun</span><span class="o">.</span><span class="p" data-group-id="6173196774-1">(</span><span class="p" data-group-id="6173196774-1">)</span></code></pre>
<p>As you can see, the <code class="inline">|&gt;</code> operator retains the same semantics
as when the pipe is not used since both require the <code class="inline">fun.(...)</code>
notation.</p>
  </section>
</div>
<div class="detail" id="%7C%7C/2">
    <span id="||/2"></span>
    <div class="detail-header">
    <a href="#%7C%7C/2" class="detail-link" title="Link to this macro">
      <span class="icon-link" aria-hidden="true"></span>
      <span class="sr-only">Link to this macro</span>
    </a>
    <span class="signature">left || right</span>
      <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/kernel.ex#L3115" class="view-source" rel="help" title="View Source">
       <span class="icon-code" aria-hidden="true"></span>
       <span class="sr-only">View Source</span>
     </a>
    
      <span class="note">(macro)</span>
      </div>
  <section class="docstring">
<p>Provides a short-circuit operator that evaluates and returns the second
expression only if the first one does not evaluate to <code class="inline">true</code> (i.e., it
is either <code class="inline">nil</code> or <code class="inline">false</code>). Returns the first expression otherwise.</p>
<p>Not allowed in guard clauses.</p>
<h2 id="%7C%7C/2-examples" class="section-heading">
  <a href="#%7C%7C/2-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
  Examples
</h2>

<pre><code class="nohighlight makeup elixir"><span class="gp unselectable">iex&gt; </span><span class="nc">Enum</span><span class="o">.</span><span class="n">empty?</span><span class="p" data-group-id="2895976289-1">(</span><span class="p" data-group-id="2895976289-2">[</span><span class="mi">1</span><span class="p" data-group-id="2895976289-2">]</span><span class="p" data-group-id="2895976289-1">)</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="nc">Enum</span><span class="o">.</span><span class="n">empty?</span><span class="p" data-group-id="2895976289-3">(</span><span class="p" data-group-id="2895976289-4">[</span><span class="mi">1</span><span class="p" data-group-id="2895976289-4">]</span><span class="p" data-group-id="2895976289-3">)</span><span class="w">
</span><span class="no">false</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="nc">List</span><span class="o">.</span><span class="n">first</span><span class="p" data-group-id="2895976289-5">(</span><span class="p" data-group-id="2895976289-6">[</span><span class="p" data-group-id="2895976289-6">]</span><span class="p" data-group-id="2895976289-5">)</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="no">true</span><span class="w">
</span><span class="no">true</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="nc">Enum</span><span class="o">.</span><span class="n">empty?</span><span class="p" data-group-id="2895976289-7">(</span><span class="p" data-group-id="2895976289-8">[</span><span class="mi">1</span><span class="p" data-group-id="2895976289-8">]</span><span class="p" data-group-id="2895976289-7">)</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="mi">1</span><span class="w">
</span><span class="mi">1</span><span class="w">

</span><span class="gp unselectable">iex&gt; </span><span class="nc">Enum</span><span class="o">.</span><span class="n">empty?</span><span class="p" data-group-id="2895976289-9">(</span><span class="p" data-group-id="2895976289-10">[</span><span class="p" data-group-id="2895976289-10">]</span><span class="p" data-group-id="2895976289-9">)</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="k">throw</span><span class="p" data-group-id="2895976289-11">(</span><span class="ss">:bad</span><span class="p" data-group-id="2895976289-11">)</span><span class="w">
</span><span class="no">true</span></code></pre>
<p>Note that, unlike <a href="#or/2"><code class="inline">or/2</code></a>, this operator accepts any expression
as the first argument, not only booleans.</p>
  </section>
</div>
        </section>

          <footer class="footer">
        <p>
          <span class="line">
            Built using
            <a href="https://github.com/elixir-lang/ex_doc" title="ExDoc" target="_blank" rel="help noopener">ExDoc</a> (v0.19.1),
          </span>
          <span class="line">
            designed by
            <a href="https://twitter.com/dignifiedquire" target="_blank" rel="noopener" title="@dignifiedquire">Friedel Ziegelmayer</a>.
            </span>
        </p>
      </footer>
    </div>
  </div>
</section>
</div>
  <script src="dist/app-a0c90688fa.js"></script>
  
  </body>
</html>