<section xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="sec-nix-syntax-summary">
  <title>Syntax Summary</title>
  <para>
    Below is a summary of the most important syntactic constructs in the
    Nix expression language. It’s not complete. In particular, there are
    many other built-in functions. See the
    <link xlink:href="https://nixos.org/nix/manual/#chap-writing-nix-expressions">Nix
    manual</link> for the rest.
  </para>
  <informaltable>
    <tgroup cols="2">
      <colspec align="left" />
      <colspec align="left" />
      <thead>
        <row>
          <entry>
            Example
          </entry>
          <entry>
            Description
          </entry>
        </row>
      </thead>
      <tbody>
        <row>
          <entry>
            <emphasis>Basic values</emphasis>
          </entry>
          <entry>
          </entry>
        </row>
        <row>
          <entry>
            <literal>&quot;Hello world&quot;</literal>
          </entry>
          <entry>
            A string
          </entry>
        </row>
        <row>
          <entry>
            <literal>&quot;${pkgs.bash}/bin/sh&quot;</literal>
          </entry>
          <entry>
            A string containing an expression (expands to
            <literal>&quot;/nix/store/hash-bash-version/bin/sh&quot;</literal>)
          </entry>
        </row>
        <row>
          <entry>
            <literal>true</literal>, <literal>false</literal>
          </entry>
          <entry>
            Booleans
          </entry>
        </row>
        <row>
          <entry>
            <literal>123</literal>
          </entry>
          <entry>
            An integer
          </entry>
        </row>
        <row>
          <entry>
            <literal>./foo.png</literal>
          </entry>
          <entry>
            A path (relative to the containing Nix expression)
          </entry>
        </row>
        <row>
          <entry>
            <emphasis>Compound values</emphasis>
          </entry>
          <entry>
          </entry>
        </row>
        <row>
          <entry>
            <literal>{ x = 1; y = 2; }</literal>
          </entry>
          <entry>
            A set with attributes named <literal>x</literal> and
            <literal>y</literal>
          </entry>
        </row>
        <row>
          <entry>
            <literal>{ foo.bar = 1; }</literal>
          </entry>
          <entry>
            A nested set, equivalent to
            <literal>{ foo = { bar = 1; }; }</literal>
          </entry>
        </row>
        <row>
          <entry>
            <literal>rec { x = &quot;foo&quot;; y = x + &quot;bar&quot;; }</literal>
          </entry>
          <entry>
            A recursive set, equivalent to
            <literal>{ x = &quot;foo&quot;; y = &quot;foobar&quot;; }</literal>
          </entry>
        </row>
        <row>
          <entry>
            <literal>[ &quot;foo&quot; &quot;bar&quot; ]</literal>
          </entry>
          <entry>
            A list with two elements
          </entry>
        </row>
        <row>
          <entry>
            <emphasis>Operators</emphasis>
          </entry>
          <entry>
          </entry>
        </row>
        <row>
          <entry>
            <literal>&quot;foo&quot; + &quot;bar&quot;</literal>
          </entry>
          <entry>
            String concatenation
          </entry>
        </row>
        <row>
          <entry>
            <literal>1 + 2</literal>
          </entry>
          <entry>
            Integer addition
          </entry>
        </row>
        <row>
          <entry>
            <literal>&quot;foo&quot; == &quot;f&quot; + &quot;oo&quot;</literal>
          </entry>
          <entry>
            Equality test (evaluates to <literal>true</literal>)
          </entry>
        </row>
        <row>
          <entry>
            <literal>&quot;foo&quot; != &quot;bar&quot;</literal>
          </entry>
          <entry>
            Inequality test (evaluates to <literal>true</literal>)
          </entry>
        </row>
        <row>
          <entry>
            <literal>!true</literal>
          </entry>
          <entry>
            Boolean negation
          </entry>
        </row>
        <row>
          <entry>
            <literal>{ x = 1; y = 2; }.x</literal>
          </entry>
          <entry>
            Attribute selection (evaluates to <literal>1</literal>)
          </entry>
        </row>
        <row>
          <entry>
            <literal>{ x = 1; y = 2; }.z or 3</literal>
          </entry>
          <entry>
            Attribute selection with default (evaluates to
            <literal>3</literal>)
          </entry>
        </row>
        <row>
          <entry>
            <literal>{ x = 1; y = 2; } // { z = 3; }</literal>
          </entry>
          <entry>
            Merge two sets (attributes in the right-hand set taking
            precedence)
          </entry>
        </row>
        <row>
          <entry>
            <emphasis>Control structures</emphasis>
          </entry>
          <entry>
          </entry>
        </row>
        <row>
          <entry>
            <literal>if 1 + 1 == 2 then &quot;yes!&quot; else &quot;no!&quot;</literal>
          </entry>
          <entry>
            Conditional expression
          </entry>
        </row>
        <row>
          <entry>
            <literal>assert 1 + 1 == 2; &quot;yes!&quot;</literal>
          </entry>
          <entry>
            Assertion check (evaluates to
            <literal>&quot;yes!&quot;</literal>). See
            <xref linkend="sec-assertions" /> for using assertions in
            modules
          </entry>
        </row>
        <row>
          <entry>
            <literal>let x = &quot;foo&quot;; y = &quot;bar&quot;; in x + y</literal>
          </entry>
          <entry>
            Variable definition
          </entry>
        </row>
        <row>
          <entry>
            <literal>with pkgs.lib; head [ 1 2 3 ]</literal>
          </entry>
          <entry>
            Add all attributes from the given set to the scope
            (evaluates to <literal>1</literal>)
          </entry>
        </row>
        <row>
          <entry>
            <emphasis>Functions (lambdas)</emphasis>
          </entry>
          <entry>
          </entry>
        </row>
        <row>
          <entry>
            <literal>x: x + 1</literal>
          </entry>
          <entry>
            A function that expects an integer and returns it increased
            by 1
          </entry>
        </row>
        <row>
          <entry>
            <literal>(x: x + 1) 100</literal>
          </entry>
          <entry>
            A function call (evaluates to 101)
          </entry>
        </row>
        <row>
          <entry>
            <literal>let inc = x: x + 1; in inc (inc (inc 100))</literal>
          </entry>
          <entry>
            A function bound to a variable and subsequently called by
            name (evaluates to 103)
          </entry>
        </row>
        <row>
          <entry>
            <literal>{ x, y }: x + y</literal>
          </entry>
          <entry>
            A function that expects a set with required attributes
            <literal>x</literal> and <literal>y</literal> and
            concatenates them
          </entry>
        </row>
        <row>
          <entry>
            <literal>{ x, y ? &quot;bar&quot; }: x + y</literal>
          </entry>
          <entry>
            A function that expects a set with required attribute
            <literal>x</literal> and optional <literal>y</literal>,
            using <literal>&quot;bar&quot;</literal> as default value
            for <literal>y</literal>
          </entry>
        </row>
        <row>
          <entry>
            <literal>{ x, y, ... }: x + y</literal>
          </entry>
          <entry>
            A function that expects a set with required attributes
            <literal>x</literal> and <literal>y</literal> and ignores
            any other attributes
          </entry>
        </row>
        <row>
          <entry>
            <literal>{ x, y } @ args: x + y</literal>
          </entry>
          <entry>
            A function that expects a set with required attributes
            <literal>x</literal> and <literal>y</literal>, and binds the
            whole set to <literal>args</literal>
          </entry>
        </row>
        <row>
          <entry>
            <emphasis>Built-in functions</emphasis>
          </entry>
          <entry>
          </entry>
        </row>
        <row>
          <entry>
            <literal>import ./foo.nix</literal>
          </entry>
          <entry>
            Load and return Nix expression in given file
          </entry>
        </row>
        <row>
          <entry>
            <literal>map (x: x + x) [ 1 2 3 ]</literal>
          </entry>
          <entry>
            Apply a function to every element of a list (evaluates to
            <literal>[ 2 4 6 ]</literal>)
          </entry>
        </row>
      </tbody>
    </tgroup>
  </informaltable>
</section>
