docs/Lix/language/constructs/index.html

2353 lines
64 KiB
HTML

<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Aux Documentation">
<meta name="author" content="Nixpkgs Aux, and Lix Contributors">
<link rel="canonical" href="https://docs.auxolotl.org/Lix/language/constructs/">
<link rel="prev" href="../builtins/">
<link rel="next" href="../derivations/">
<link rel="icon" href="../../../assets/aux-logo.svg">
<meta name="generator" content="mkdocs-1.6.0, mkdocs-material-9.5.29">
<title>Language Constructs - Aux Docs</title>
<link rel="stylesheet" href="../../../assets/stylesheets/main.76a95c52.min.css">
<link rel="stylesheet" href="../../../assets/stylesheets/palette.06af60db.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.bunny.net/css?family=IBM+Plex+Sans:300,300i,400,400i,700,700i%7CIBM+Plex+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"IBM Plex Sans";--md-code-font:"IBM Plex Mono"}</style>
<script>__md_scope=new URL("../../..",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
<meta property="og:type" content="website" >
<meta property="og:title" content="Language Constructs - Aux Docs" >
<meta property="og:description" content="Aux Documentation" >
<meta property="og:image" content="https://docs.auxolotl.org/assets/images/social/Lix/language/constructs.png" >
<meta property="og:image:type" content="image/png" >
<meta property="og:image:width" content="1200" >
<meta property="og:image:height" content="630" >
<meta property="og:url" content="https://docs.auxolotl.org/Lix/language/constructs/" >
<meta name="twitter:card" content="summary_large_image" >
<meta name="twitter:title" content="Language Constructs - Aux Docs" >
<meta name="twitter:description" content="Aux Documentation" >
<meta name="twitter:image" content="https://docs.auxolotl.org/assets/images/social/Lix/language/constructs.png" >
</head>
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="blue">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#language-constructs" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../../.." title="Aux Docs" class="md-header__button md-logo" aria-label="Aux Docs" data-md-component="logo">
<img src="../../../assets/aux-logo.svg" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Aux Docs
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Language Constructs
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="blue" aria-label="Dark Mode" type="radio" name="__palette" id="__palette_0">
<label class="md-header__button md-icon" title="Dark Mode" for="__palette_1" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m17.75 4.09-2.53 1.94.91 3.06-2.63-1.81-2.63 1.81.91-3.06-2.53-1.94L12.44 4l1.06-3 1.06 3 3.19.09m3.5 6.91-1.64 1.25.59 1.98-1.7-1.17-1.7 1.17.59-1.98L15.75 11l2.06-.05L18.5 9l.69 1.95 2.06.05m-2.28 4.95c.83-.08 1.72 1.1 1.19 1.85-.32.45-.66.87-1.08 1.27C15.17 23 8.84 23 4.94 19.07c-3.91-3.9-3.91-10.24 0-14.14.4-.4.82-.76 1.27-1.08.75-.53 1.93.36 1.85 1.19-.27 2.86.69 5.83 2.89 8.02a9.96 9.96 0 0 0 8.02 2.89m-1.64 2.02a12.08 12.08 0 0 1-7.8-3.47c-2.17-2.19-3.33-5-3.49-7.82-2.81 3.14-2.7 7.96.31 10.98 3.02 3.01 7.84 3.12 10.98.31Z"/></svg>
</label>
<input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="indigo" data-md-color-accent="blue" aria-label="Light Mode" type="radio" name="__palette" id="__palette_1">
<label class="md-header__button md-icon" title="Light Mode" for="__palette_0" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 7a5 5 0 0 1 5 5 5 5 0 0 1-5 5 5 5 0 0 1-5-5 5 5 0 0 1 5-5m0 2a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3m0-7 2.39 3.42C13.65 5.15 12.84 5 12 5c-.84 0-1.65.15-2.39.42L12 2M3.34 7l4.16-.35A7.2 7.2 0 0 0 5.94 8.5c-.44.74-.69 1.5-.83 2.29L3.34 7m.02 10 1.76-3.77a7.131 7.131 0 0 0 2.38 4.14L3.36 17M20.65 7l-1.77 3.79a7.023 7.023 0 0 0-2.38-4.15l4.15.36m-.01 10-4.14.36c.59-.51 1.12-1.14 1.54-1.86.42-.73.69-1.5.83-2.29L20.64 17M12 22l-2.41-3.44c.74.27 1.55.44 2.41.44.82 0 1.63-.17 2.37-.44L12 22Z"/></svg>
</label>
</form>
<script>var media,input,key,value,palette=__md_get("__palette");if(palette&&palette.color){"(prefers-color-scheme)"===palette.color.media&&(media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']"),palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent"));for([key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
</button>
</nav>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://git.auxolotl.org/auxolotl/docs" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M16.777 0a2.9 2.9 0 1 1-2.529 4.322H12.91a4.266 4.266 0 0 0-4.265 4.195v2.118a7.076 7.076 0 0 1 4.147-1.42l.118-.002h1.338a2.9 2.9 0 0 1 5.43 1.422 2.9 2.9 0 0 1-5.43 1.422H12.91a4.266 4.266 0 0 0-4.265 4.195v2.319A2.9 2.9 0 0 1 7.222 24 2.9 2.9 0 0 1 5.8 18.57V8.589a7.109 7.109 0 0 1 6.991-7.108l.118-.001h1.338A2.9 2.9 0 0 1 16.778 0ZM7.223 19.905a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.389Zm9.554-10.464a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.39Zm0-7.735a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.389Z"/></svg>
</div>
<div class="md-source__repository">
auxolotl/docs
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../../.." class="md-tabs__link">
Aux Documentation Hub
</a>
</li>
<li class="md-tabs__item">
<a href="../../../TODO/" class="md-tabs__link">
TODO
</a>
</li>
<li class="md-tabs__item">
<a href="../../../Aux/" class="md-tabs__link">
Aux
</a>
</li>
<li class="md-tabs__item md-tabs__item--active">
<a href="../../" class="md-tabs__link">
Lix
</a>
</li>
<li class="md-tabs__item">
<a href="../../../NixOS/appstream/" class="md-tabs__link">
NixOS
</a>
</li>
<li class="md-tabs__item">
<a href="../../../Nixpkgs/" class="md-tabs__link">
Nixpkgs
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../../.." title="Aux Docs" class="md-nav__button md-logo" aria-label="Aux Docs" data-md-component="logo">
<img src="../../../assets/aux-logo.svg" alt="logo">
</a>
Aux Docs
</label>
<div class="md-nav__source">
<a href="https://git.auxolotl.org/auxolotl/docs" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M16.777 0a2.9 2.9 0 1 1-2.529 4.322H12.91a4.266 4.266 0 0 0-4.265 4.195v2.118a7.076 7.076 0 0 1 4.147-1.42l.118-.002h1.338a2.9 2.9 0 0 1 5.43 1.422 2.9 2.9 0 0 1-5.43 1.422H12.91a4.266 4.266 0 0 0-4.265 4.195v2.319A2.9 2.9 0 0 1 7.222 24 2.9 2.9 0 0 1 5.8 18.57V8.589a7.109 7.109 0 0 1 6.991-7.108l.118-.001h1.338A2.9 2.9 0 0 1 16.778 0ZM7.223 19.905a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.389Zm9.554-10.464a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.39Zm0-7.735a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.389Z"/></svg>
</div>
<div class="md-source__repository">
auxolotl/docs
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../.." class="md-nav__link">
<span class="md-ellipsis">
Aux Documentation Hub
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../TODO/" class="md-nav__link">
<span class="md-ellipsis">
TODO
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../../Aux/" class="md-nav__link">
<span class="md-ellipsis">
Aux
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" checked>
<div class="md-nav__link md-nav__container">
<a href="../../" class="md-nav__link ">
<span class="md-ellipsis">
Lix
</span>
</a>
<label class="md-nav__link " for="__nav_4" id="__nav_4_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span>
Lix
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../glossary/" class="md-nav__link">
<span class="md-ellipsis">
Glossary
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../quick-start/" class="md-nav__link">
<span class="md-ellipsis">
Quick Start
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../Advanced-Topics/" class="md-nav__link">
<span class="md-ellipsis">
Advanced Topics
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../Command-Reference/" class="md-nav__link">
<span class="md-ellipsis">
Command Reference
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../Package-Management/" class="md-nav__link">
<span class="md-ellipsis">
Package Management
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../architecture/" class="md-nav__link">
<span class="md-ellipsis">
Architecture
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../contributing/" class="md-nav__link">
<span class="md-ellipsis">
Contributing
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../installation/" class="md-nav__link">
<span class="md-ellipsis">
Installation
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_10" checked>
<div class="md-nav__link md-nav__container">
<a href="../" class="md-nav__link ">
<span class="md-ellipsis">
Language
</span>
</a>
<label class="md-nav__link " for="__nav_4_10" id="__nav_4_10_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_10_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_4_10">
<span class="md-nav__icon md-icon"></span>
Language
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../advanced-attributes/" class="md-nav__link">
<span class="md-ellipsis">
Advanced Attributes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../builtin-constants/" class="md-nav__link">
<span class="md-ellipsis">
Built-in Constants
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../builtins/" class="md-nav__link">
<span class="md-ellipsis">
Built-in Functions
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Language Constructs
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Language Constructs
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#recursive-sets" class="md-nav__link">
<span class="md-ellipsis">
Recursive sets
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#let-expressions" class="md-nav__link">
<span class="md-ellipsis">
Let-expressions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#inheriting-attributes" class="md-nav__link">
<span class="md-ellipsis">
Inheriting attributes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#functions" class="md-nav__link">
<span class="md-ellipsis">
Functions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#conditionals" class="md-nav__link">
<span class="md-ellipsis">
Conditionals
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#assertions" class="md-nav__link">
<span class="md-ellipsis">
Assertions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#with-expressions" class="md-nav__link">
<span class="md-ellipsis">
With-expressions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#comments" class="md-nav__link">
<span class="md-ellipsis">
Comments
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#context-dependent-keywords" class="md-nav__link">
<span class="md-ellipsis">
Context-dependent keywords
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../derivations/" class="md-nav__link">
<span class="md-ellipsis">
Derivations
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../operators/" class="md-nav__link">
<span class="md-ellipsis">
Operators
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../string-interpolation/" class="md-nav__link">
<span class="md-ellipsis">
String interpolation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../values/" class="md-nav__link">
<span class="md-ellipsis">
Data Types
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../protocols/" class="md-nav__link">
<span class="md-ellipsis">
Protocols
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../release-notes/" class="md-nav__link">
<span class="md-ellipsis">
Release notes
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../../NixOS/appstream/" class="md-nav__link">
<span class="md-ellipsis">
NixOS
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../../Nixpkgs/" class="md-nav__link">
<span class="md-ellipsis">
Nixpkgs
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#recursive-sets" class="md-nav__link">
<span class="md-ellipsis">
Recursive sets
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#let-expressions" class="md-nav__link">
<span class="md-ellipsis">
Let-expressions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#inheriting-attributes" class="md-nav__link">
<span class="md-ellipsis">
Inheriting attributes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#functions" class="md-nav__link">
<span class="md-ellipsis">
Functions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#conditionals" class="md-nav__link">
<span class="md-ellipsis">
Conditionals
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#assertions" class="md-nav__link">
<span class="md-ellipsis">
Assertions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#with-expressions" class="md-nav__link">
<span class="md-ellipsis">
With-expressions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#comments" class="md-nav__link">
<span class="md-ellipsis">
Comments
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#context-dependent-keywords" class="md-nav__link">
<span class="md-ellipsis">
Context-dependent keywords
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="language-constructs">Language Constructs</h1>
<h3 id="recursive-sets">Recursive sets</h3>
<p>Recursive sets are like normal <a href="../values/#attribute-set">attribute sets</a>, but the attributes can refer to each other.</p>
<blockquote>
<p><em>rec-attrset</em> = <code>rec {</code> [ <em>name</em> <code>=</code> <em>expr</em> <code>;</code> <code>]</code>... <code>}</code></p>
</blockquote>
<p>Example:</p>
<div class="highlight"><pre><span></span><code><span class="k">rec</span> <span class="p">{</span>
<span class="ss">x</span> <span class="o">=</span> y<span class="p">;</span>
<span class="ss">y</span> <span class="o">=</span> <span class="mi">123</span><span class="p">;</span>
<span class="p">}</span><span class="o">.</span>x
</code></pre></div>
<p>This evaluates to <code>123</code>.</p>
<p>Note that without <code>rec</code> the binding <code>x = y;</code> would
refer to the variable <code>y</code> in the surrounding scope, if one exists, and
would be invalid if no such variable exists. That is, in a normal
(non-recursive) set, attributes are not added to the lexical scope; in a
recursive set, they are.</p>
<p>Recursive sets of course introduce the danger of infinite recursion. For
example, the expression</p>
<div class="highlight"><pre><span></span><code><span class="k">rec</span> <span class="p">{</span>
<span class="ss">x</span> <span class="o">=</span> y<span class="p">;</span>
<span class="ss">y</span> <span class="o">=</span> x<span class="p">;</span>
<span class="p">}</span><span class="o">.</span>x
</code></pre></div>
<p>will crash with an <code>infinite recursion encountered</code> error message.</p>
<h3 id="let-expressions">Let-expressions</h3>
<p>A let-expression allows you to define local variables for an expression.</p>
<blockquote>
<p><em>let-in</em> = <code>let</code> [ <em>identifier</em> = <em>expr</em> ]... <code>in</code> <em>expr</em></p>
</blockquote>
<p>Example:</p>
<div class="highlight"><pre><span></span><code><span class="k">let</span>
<span class="ss">x</span> <span class="o">=</span> <span class="s2">&quot;foo&quot;</span><span class="p">;</span>
<span class="ss">y</span> <span class="o">=</span> <span class="s2">&quot;bar&quot;</span><span class="p">;</span>
<span class="k">in</span> x <span class="o">+</span> y
</code></pre></div>
<p>This evaluates to <code>"foobar"</code>.</p>
<h3 id="inheriting-attributes">Inheriting attributes</h3>
<p>When defining an <a href="../values/#attribute-set">attribute set</a> or in a <a href="#let-expressions">let-expression</a> it is often convenient to copy variables from the surrounding lexical scope (e.g., when you want to propagate attributes).
This can be shortened using the <code>inherit</code> keyword.</p>
<p>Example:</p>
<div class="highlight"><pre><span></span><code><span class="k">let</span> <span class="ss">x</span> <span class="o">=</span> <span class="mi">123</span><span class="p">;</span> <span class="k">in</span>
<span class="p">{</span>
<span class="k">inherit</span> x<span class="p">;</span>
<span class="ss">y</span> <span class="o">=</span> <span class="mi">456</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p>is equivalent to</p>
<div class="highlight"><pre><span></span><code><span class="k">let</span> <span class="ss">x</span> <span class="o">=</span> <span class="mi">123</span><span class="p">;</span> <span class="k">in</span>
<span class="p">{</span>
<span class="ss">x</span> <span class="o">=</span> x<span class="p">;</span>
<span class="ss">y</span> <span class="o">=</span> <span class="mi">456</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p>and both evaluate to <code>{ x = 123; y = 456; }</code>.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>This works because <code>x</code> is added to the lexical scope by the <code>let</code> construct.</p>
</div>
<p>It is also possible to inherit attributes from another attribute set.</p>
<p>Example:</p>
<p>In this fragment from <code>all-packages.nix</code>,</p>
<div class="highlight"><pre><span></span><code><span class="ss">graphviz</span> <span class="o">=</span> <span class="p">(</span><span class="nb">import</span> <span class="l">../tools/graphics/graphviz</span><span class="p">)</span> <span class="p">{</span>
<span class="k">inherit</span> fetchurl stdenv libpng libjpeg expat x11 yacc<span class="p">;</span>
<span class="k">inherit</span> <span class="p">(</span>xorg<span class="p">)</span> libXaw<span class="p">;</span>
<span class="p">};</span>
<span class="ss">xorg</span> <span class="o">=</span> <span class="p">{</span>
<span class="ss">libX11</span> <span class="o">=</span> <span class="o">...</span><span class="p">;</span>
<span class="ss">libXaw</span> <span class="o">=</span> <span class="o">...</span><span class="p">;</span>
<span class="o">...</span>
<span class="p">}</span>
<span class="ss">libpng</span> <span class="o">=</span> <span class="o">...</span><span class="p">;</span>
<span class="ss">libjpg</span> <span class="o">=</span> <span class="o">...</span><span class="p">;</span>
<span class="o">...</span>
</code></pre></div>
<p>the set used in the function call to the function defined in
<code>../tools/graphics/graphviz</code> inherits a number of variables from the
surrounding scope (<code>fetchurl</code> ... <code>yacc</code>), but also inherits <code>libXaw</code>
(the X Athena Widgets) from the <code>xorg</code> set.</p>
<p>Summarizing the fragment</p>
<div class="highlight"><pre><span></span><code><span class="o">...</span>
<span class="k">inherit</span> x y z<span class="p">;</span>
<span class="k">inherit</span> <span class="p">(</span>src-set<span class="p">)</span> a b c<span class="p">;</span>
<span class="o">...</span>
</code></pre></div>
<p>is equivalent to</p>
<div class="highlight"><pre><span></span><code><span class="o">...</span>
<span class="ss">x</span> <span class="o">=</span> x<span class="p">;</span> <span class="ss">y</span> <span class="o">=</span> y<span class="p">;</span> <span class="ss">z</span> <span class="o">=</span> z<span class="p">;</span>
<span class="ss">a</span> <span class="o">=</span> src-set<span class="o">.</span>a<span class="p">;</span> <span class="ss">b</span> <span class="o">=</span> src-set<span class="o">.</span>b<span class="p">;</span> <span class="ss">c</span> <span class="o">=</span> src-set<span class="o">.</span>c<span class="p">;</span>
<span class="o">...</span>
</code></pre></div>
<p>when used while defining local variables in a let-expression or while
defining a set.</p>
<h3 id="functions">Functions</h3>
<p>Functions have the following form:</p>
<div class="highlight"><pre><span></span><code>pattern<span class="p">:</span> body
</code></pre></div>
<p>The pattern specifies what the argument of the function must look like,
and binds variables in the body to (parts of) the argument. There are
three kinds of patterns:</p>
<ul>
<li>
<p>If a pattern is a single identifier, then the function matches any
argument. Example:</p>
<div class="highlight"><pre><span></span><code><span class="k">let</span> <span class="ss">negate</span> <span class="o">=</span> x<span class="p">:</span> <span class="o">!</span>x<span class="p">;</span>
<span class="ss">concat</span> <span class="o">=</span> x<span class="p">:</span> y<span class="p">:</span> x <span class="o">+</span> y<span class="p">;</span>
<span class="k">in</span> <span class="k">if</span> negate <span class="no">true</span> <span class="k">then</span> concat <span class="s2">&quot;foo&quot;</span> <span class="s2">&quot;bar&quot;</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
</code></pre></div>
<p>Note that <code>concat</code> is a function that takes one argument and returns
a function that takes another argument. This allows partial
parameterisation (i.e., only filling some of the arguments of a
function); e.g.,</p>
<div class="highlight"><pre><span></span><code><span class="nb">map</span> <span class="p">(</span>concat <span class="s2">&quot;foo&quot;</span><span class="p">)</span> <span class="p">[</span> <span class="s2">&quot;bar&quot;</span> <span class="s2">&quot;bla&quot;</span> <span class="s2">&quot;abc&quot;</span> <span class="p">]</span>
</code></pre></div>
<p>evaluates to <code>[ "foobar" "foobla" "fooabc" ]</code>.</p>
</li>
<li>
<p>A <em>set pattern</em> of the form <code>{ name1, name2, …, nameN }</code> matches a
set containing the listed attributes, and binds the values of those
attributes to variables in the function body. For example, the
function</p>
<div class="highlight"><pre><span></span><code><span class="p">{</span> x<span class="p">,</span> y<span class="p">,</span> z <span class="p">}:</span> z <span class="o">+</span> y <span class="o">+</span> x
</code></pre></div>
<p>can only be called with a set containing exactly the attributes <code>x</code>,
<code>y</code> and <code>z</code>. No other attributes are allowed. If you want to allow
additional arguments, you can use an ellipsis (<code>...</code>):</p>
<div class="highlight"><pre><span></span><code><span class="p">{</span> x<span class="p">,</span> y<span class="p">,</span> z<span class="p">,</span> <span class="o">...</span> <span class="p">}:</span> z <span class="o">+</span> y <span class="o">+</span> x
</code></pre></div>
<p>This works on any set that contains at least the three named
attributes.</p>
<p>It is possible to provide <em>default values</em> for attributes, in
which case they are allowed to be missing. A default value is
specified by writing <code>name ? e</code>, where <em>e</em> is an arbitrary
expression. For example,</p>
<div class="highlight"><pre><span></span><code><span class="p">{</span> x<span class="p">,</span> y <span class="o">?</span> <span class="s2">&quot;foo&quot;</span><span class="p">,</span> z <span class="o">?</span> <span class="s2">&quot;bar&quot;</span> <span class="p">}:</span> z <span class="o">+</span> y <span class="o">+</span> x
</code></pre></div>
<p>specifies a function that only requires an attribute named <code>x</code>, but
optionally accepts <code>y</code> and <code>z</code>.</p>
</li>
<li>
<p>An <code>@</code>-pattern provides a means of referring to the whole value
being matched:</p>
<div class="highlight"><pre><span></span><code>args<span class="p">@{</span> x<span class="p">,</span> y<span class="p">,</span> z<span class="p">,</span> <span class="o">...</span> <span class="p">}:</span> z <span class="o">+</span> y <span class="o">+</span> x <span class="o">+</span> args<span class="o">.</span>a
</code></pre></div>
<p>but can also be written as:</p>
<div class="highlight"><pre><span></span><code><span class="p">{</span> x<span class="p">,</span> y<span class="p">,</span> z<span class="p">,</span> <span class="o">...</span> <span class="p">}</span> <span class="p">@</span> args<span class="p">:</span> z <span class="o">+</span> y <span class="o">+</span> x <span class="o">+</span> args<span class="o">.</span>a
</code></pre></div>
<p>Here <code>args</code> is bound to the argument <em>as passed</em>, which is further
matched against the pattern <code>{ x, y, z, ... }</code>.
The <code>@</code>-pattern makes mainly sense with an ellipsis(<code>...</code>) as
you can access attribute names as <code>a</code>, using <code>args.a</code>, which was
given as an additional attribute to the function.</p>
</li>
</ul>
<div class="admonition warning">
<p class="admonition-title">Warning</p>
<p><code>args@</code> binds the name <code>args</code> to the attribute set that is passed to the function.
In particular, <code>args</code> does <em>not</em> include any default values specified with <code>?</code> in the function's set pattern.</p>
<p>For instance</p>
<div class="highlight"><pre><span></span><code><span class="k">let</span>
<span class="ss">f</span> <span class="o">=</span> args<span class="p">@{</span> a <span class="o">?</span> <span class="mi">23</span><span class="p">,</span> <span class="o">...</span> <span class="p">}:</span> <span class="p">[</span> a args <span class="p">];</span>
<span class="k">in</span>
f <span class="p">{}</span>
</code></pre></div>
<p>is equivalent to</p>
<div class="highlight"><pre><span></span><code><span class="k">let</span>
<span class="ss">f</span> <span class="o">=</span> args <span class="p">@</span> <span class="p">{</span> <span class="o">...</span> <span class="p">}:</span> <span class="p">[</span> <span class="p">(</span>args<span class="o">.</span>a <span class="ow">or</span> <span class="mi">23</span><span class="p">)</span> args <span class="p">];</span>
<span class="k">in</span>
f <span class="p">{}</span>
</code></pre></div>
<p>and both expressions will evaluate to:</p>
<div class="highlight"><pre><span></span><code><span class="p">[</span> <span class="mi">23</span> <span class="p">{}</span> <span class="p">]</span>
</code></pre></div>
</div>
<p>Note that functions do not have names. If you want to give them a name,
you can bind them to an attribute, e.g.,</p>
<div class="highlight"><pre><span></span><code><span class="k">let</span> <span class="ss">concat</span> <span class="o">=</span> <span class="p">{</span> x<span class="p">,</span> y <span class="p">}:</span> x <span class="o">+</span> y<span class="p">;</span>
<span class="k">in</span> concat <span class="p">{</span> <span class="ss">x</span> <span class="o">=</span> <span class="s2">&quot;foo&quot;</span><span class="p">;</span> <span class="ss">y</span> <span class="o">=</span> <span class="s2">&quot;bar&quot;</span><span class="p">;</span> <span class="p">}</span>
</code></pre></div>
<h3 id="conditionals">Conditionals</h3>
<p>Conditionals look like this:</p>
<div class="highlight"><pre><span></span><code><span class="k">if</span> e1 <span class="k">then</span> e2 <span class="k">else</span> e3
</code></pre></div>
<p>where <em>e1</em> is an expression that should evaluate to a Boolean value
(<code>true</code> or <code>false</code>).</p>
<h3 id="assertions">Assertions</h3>
<p>Assertions are generally used to check that certain requirements on or
between features and dependencies hold. They look like this:</p>
<div class="highlight"><pre><span></span><code><span class="k">assert</span> e1<span class="p">;</span> e2
</code></pre></div>
<p>where <em>e1</em> is an expression that should evaluate to a Boolean value. If
it evaluates to <code>true</code>, <em>e2</em> is returned; otherwise expression
evaluation is aborted and a backtrace is printed.</p>
<p>Here is a Nix expression for the Subversion package that shows how
assertions can be used:.</p>
<div class="highlight"><pre><span></span><code><span class="p">{</span> localServer <span class="o">?</span> <span class="no">false</span>
<span class="p">,</span> httpServer <span class="o">?</span> <span class="no">false</span>
<span class="p">,</span> sslSupport <span class="o">?</span> <span class="no">false</span>
<span class="p">,</span> pythonBindings <span class="o">?</span> <span class="no">false</span>
<span class="p">,</span> javaSwigBindings <span class="o">?</span> <span class="no">false</span>
<span class="p">,</span> javahlBindings <span class="o">?</span> <span class="no">false</span>
<span class="p">,</span> stdenv<span class="p">,</span> fetchurl
<span class="p">,</span> openssl <span class="o">?</span> <span class="no">null</span><span class="p">,</span> httpd <span class="o">?</span> <span class="no">null</span><span class="p">,</span> db4 <span class="o">?</span> <span class="no">null</span><span class="p">,</span> expat<span class="p">,</span> swig <span class="o">?</span> <span class="no">null</span><span class="p">,</span> j2sdk <span class="o">?</span> <span class="no">null</span>
<span class="p">}:</span>
<span class="k">assert</span> localServer <span class="o">-&gt;</span> db4 <span class="o">!=</span> <span class="no">null</span><span class="p">;</span> <span class="err"></span>
<span class="k">assert</span> httpServer <span class="o">-&gt;</span> httpd <span class="o">!=</span> <span class="no">null</span> <span class="o">&amp;&amp;</span> httpd<span class="o">.</span><span class="ss">expat</span> <span class="o">==</span> expat<span class="p">;</span> <span class="err"></span>
<span class="k">assert</span> sslSupport <span class="o">-&gt;</span> openssl <span class="o">!=</span> <span class="no">null</span> <span class="o">&amp;&amp;</span> <span class="p">(</span>httpServer <span class="o">-&gt;</span> httpd<span class="o">.</span><span class="ss">openssl</span> <span class="o">==</span> openssl<span class="p">);</span> <span class="err"></span>
<span class="k">assert</span> pythonBindings <span class="o">-&gt;</span> swig <span class="o">!=</span> <span class="no">null</span> <span class="o">&amp;&amp;</span> swig<span class="o">.</span>pythonSupport<span class="p">;</span>
<span class="k">assert</span> javaSwigBindings <span class="o">-&gt;</span> swig <span class="o">!=</span> <span class="no">null</span> <span class="o">&amp;&amp;</span> swig<span class="o">.</span>javaSupport<span class="p">;</span>
<span class="k">assert</span> javahlBindings <span class="o">-&gt;</span> j2sdk <span class="o">!=</span> <span class="no">null</span><span class="p">;</span>
stdenv<span class="o">.</span>mkDerivation <span class="p">{</span>
<span class="ss">name</span> <span class="o">=</span> <span class="s2">&quot;subversion-1.1.1&quot;</span><span class="p">;</span>
<span class="o">...</span>
<span class="ss">openssl</span> <span class="o">=</span> <span class="k">if</span> sslSupport <span class="k">then</span> openssl <span class="k">else</span> <span class="no">null</span><span class="p">;</span> <span class="err"></span>
<span class="o">...</span>
<span class="p">}</span>
</code></pre></div>
<p>The points of interest are:</p>
<ol>
<li>
<p>This assertion states that if Subversion is to have support for
local repositories, then Berkeley DB is needed. So if the Subversion
function is called with the <code>localServer</code> argument set to <code>true</code> but
the <code>db4</code> argument set to <code>null</code>, then the evaluation fails.</p>
<p>Note that <code>-&gt;</code> is the <a href="https://en.wikipedia.org/wiki/Truth_table#Logical_implication">logical
implication</a>
Boolean operation.</p>
</li>
<li>
<p>This is a more subtle condition: if Subversion is built with Apache
(<code>httpServer</code>) support, then the Expat library (an XML library) used
by Subversion should be same as the one used by Apache. This is
because in this configuration Subversion code ends up being linked
with Apache code, and if the Expat libraries do not match, a build-
or runtime link error or incompatibility might occur.</p>
</li>
<li>
<p>This assertion says that in order for Subversion to have SSL support
(so that it can access <code>https</code> URLs), an OpenSSL library must be
passed. Additionally, it says that <em>if</em> Apache support is enabled,
then Apache's OpenSSL should match Subversion's. (Note that if
Apache support is not enabled, we don't care about Apache's
OpenSSL.)</p>
</li>
<li>
<p>The conditional here is not really related to assertions, but is
worth pointing out: it ensures that if SSL support is disabled, then
the Subversion derivation is not dependent on OpenSSL, even if a
non-<code>null</code> value was passed. This prevents an unnecessary rebuild of
Subversion if OpenSSL changes.</p>
</li>
</ol>
<h3 id="with-expressions">With-expressions</h3>
<p>A <em>with-expression</em>,</p>
<div class="highlight"><pre><span></span><code><span class="k">with</span> e1<span class="p">;</span> e2
</code></pre></div>
<p>introduces the set <em>e1</em> into the lexical scope of the expression <em>e2</em>.
For instance,</p>
<div class="highlight"><pre><span></span><code><span class="k">let</span> <span class="ss">as</span> <span class="o">=</span> <span class="p">{</span> <span class="ss">x</span> <span class="o">=</span> <span class="s2">&quot;foo&quot;</span><span class="p">;</span> <span class="ss">y</span> <span class="o">=</span> <span class="s2">&quot;bar&quot;</span><span class="p">;</span> <span class="p">};</span>
<span class="k">in</span> <span class="k">with</span> as<span class="p">;</span> x <span class="o">+</span> y
</code></pre></div>
<p>evaluates to <code>"foobar"</code> since the <code>with</code> adds the <code>x</code> and <code>y</code> attributes
of <code>as</code> to the lexical scope in the expression <code>x + y</code>. The most common
use of <code>with</code> is in conjunction with the <code>import</code> function. E.g.,</p>
<div class="highlight"><pre><span></span><code><span class="k">with</span> <span class="p">(</span><span class="nb">import</span> <span class="l">./definitions.nix</span><span class="p">);</span> <span class="o">...</span>
</code></pre></div>
<p>makes all attributes defined in the file <code>definitions.nix</code> available as
if they were defined locally in a <code>let</code>-expression.</p>
<p>The bindings introduced by <code>with</code> do not shadow bindings introduced by
other means, e.g.</p>
<div class="highlight"><pre><span></span><code><span class="k">let</span> <span class="ss">a</span> <span class="o">=</span> <span class="mi">3</span><span class="p">;</span> <span class="k">in</span> <span class="k">with</span> <span class="p">{</span> <span class="ss">a</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="p">};</span> <span class="k">let</span> <span class="ss">a</span> <span class="o">=</span> <span class="mi">4</span><span class="p">;</span> <span class="k">in</span> <span class="k">with</span> <span class="p">{</span> <span class="ss">a</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span> <span class="p">};</span> <span class="o">...</span>
</code></pre></div>
<p>establishes the same scope as</p>
<div class="highlight"><pre><span></span><code><span class="k">let</span> <span class="ss">a</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="k">in</span> <span class="k">let</span> <span class="ss">a</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span> <span class="k">in</span> <span class="k">let</span> <span class="ss">a</span> <span class="o">=</span> <span class="mi">3</span><span class="p">;</span> <span class="k">in</span> <span class="k">let</span> <span class="ss">a</span> <span class="o">=</span> <span class="mi">4</span><span class="p">;</span> <span class="k">in</span> <span class="o">...</span>
</code></pre></div>
<h3 id="comments">Comments</h3>
<p>Comments can be single-line, started with a <code>#</code> character, or
inline/multi-line, enclosed within <code>/* ... */</code>.</p>
<h3 id="context-dependent-keywords">Context-dependent keywords</h3>
<dl>
<dt id="keywords-__curPos">
<a href="#keywords-__curPos"><code>__curPos</code></a>
</dt>
<dd>
A quasi-constant which will be replaced with an attribute set describing
the location where `__curPos` was used, with attributes `file`, `line`,
and `column`. For example, `import ./file.nix` will result in
<div class="highlight"><pre><span></span><code><span class="p">{</span>
<span class="ss">column</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
<span class="ss">file</span> <span class="o">=</span> <span class="s2">&quot;/path/to/some/file.nix&quot;</span><span class="p">;</span>
<span class="ss">line</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
assuming `file.nix` contains nothing but `__curPos`.
In context without a source file (such as `nix-repl`), it will always
be replaced with `null`:
<div class="highlight"><pre><span></span><code>nix-repl&gt; __curPos
null
</code></pre></div>
While it may vaguely look like a builtin, this is a very different beast
that is handled directly by the parser. It thus cannot be shadowed,
bound to a different name, and is also not available under
[`builtins`](../language/builtin-constants.md#builtins-builtins).
<div class="highlight"><pre><span></span><code>nix-repl&gt; let __curPos = &quot;no&quot;; in __curPos
null
</code></pre></div>
Despite this `__curPos`, much like `or`, may still be used as an identifier,
it is only treated specially when it appears as an unqualified name:
<div class="highlight"><pre><span></span><code>nix-repl&gt; { __curPos = 1; }.__curPos
1
</code></pre></div>
</dd>
<dt id="keywords-or">
<a href="#keywords-or"><code>or</code></a>
</dt>
<dd>
`or` is used in [Attribute selection](../language/operators.html#attribute-selection),
where it is a keyword.
However, it is not a keyword in some other contexts, and can be used as
a binding name in attribute sets, let-bindings, non-initial function
application position, and as a label in attribute paths.
Its use as anything other than a keyword is discouraged.
</dd>
</dl>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
<div class="md-copyright__highlight">
Licenced MIT
</div>
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
<div class="md-social">
<a href="https://git.auxolotl.org/auxolotl/docs" target="_blank" rel="noopener" title="Aux Docs Repo" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M16.777 0a2.9 2.9 0 1 1-2.529 4.322H12.91a4.266 4.266 0 0 0-4.265 4.195v2.118a7.076 7.076 0 0 1 4.147-1.42l.118-.002h1.338a2.9 2.9 0 0 1 5.43 1.422 2.9 2.9 0 0 1-5.43 1.422H12.91a4.266 4.266 0 0 0-4.265 4.195v2.319A2.9 2.9 0 0 1 7.222 24 2.9 2.9 0 0 1 5.8 18.57V8.589a7.109 7.109 0 0 1 6.991-7.108l.118-.001h1.338A2.9 2.9 0 0 1 16.778 0ZM7.223 19.905a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.389Zm9.554-10.464a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.39Zm0-7.735a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.389Z"/></svg>
</a>
<a href="https://forum.aux.computer/" target="_blank" rel="noopener" title="Aux Forum" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12.103 0C18.666 0 24 5.485 24 11.997c0 6.51-5.33 11.99-11.9 11.99L0 24V11.79C0 5.28 5.532 0 12.103 0zm.116 4.563a7.395 7.395 0 0 0-6.337 3.57 7.247 7.247 0 0 0-.148 7.22L4.4 19.61l4.794-1.074a7.424 7.424 0 0 0 8.136-1.39 7.256 7.256 0 0 0 1.737-7.997 7.375 7.375 0 0 0-6.84-4.585h-.008z"/></svg>
</a>
<a href="https://wiki.auxolotl.org/" target="_blank" rel="noopener" title="Aux Wiki" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17.801 13.557c.148.098.288.202.417.313 1.854 1.6 3.127 4.656 2.582 7.311-1.091-.255-5.747-1.055-7.638-3.383-.91-1.12-1.366-2.081-1.569-2.885a5.65 5.65 0 0 0 .034-.219c.089.198.197.35.313.466.24.24.521.335.766.372.304.046.594-.006.806-.068l.001.001c.05-.015.433-.116.86-.342.325-.173 2.008-.931 3.428-1.566Zm-7.384 1.435C9.156 16.597 6.6 18.939.614 18.417c.219-1.492 1.31-3.019 2.51-4.11.379-.345.906-.692 1.506-1.009.286.168.598.332.939.486 2.689 1.221 3.903 1.001 4.89.573a1.3 1.3 0 0 0 .054-.025 6.156 6.156 0 0 0-.096.66Zm4.152-.462c.38-.341.877-.916 1.383-1.559-.389-.15-.866-.371-1.319-.591-.598-.29-1.305-.283-2.073-.315a4.685 4.685 0 0 1-.804-.103c.014-.123.027-.246.038-.369.062.104.673.057.871.057.354 0 1.621.034 3.074-.574 1.452-.608 2.55-1.706 3.022-3.225.474-1.52.22-3.091-.168-3.952-.169.709-1.453 2.381-1.926 2.871-.473.489-2.381 2.296-2.972 2.921-.7.74-.688.793-1.332 1.302-.202.19-.499.402-.563.53.027-.338.039-.675.027-.997a7.653 7.653 0 0 0-.032-.523c.322-.059.567-.522.567-.861 0-.224-.106-.247-.271-.229.075-.894.382-3.923 1.254-4.281.218.109.831.068.649-.295-.182-.364-.825-.074-1.081.266-.28.374-.956 2.046-.92 4.324-.113.014-.174.033-.322.033-.171 0-.321-.04-.433-.05.034-2.275-.714-3.772-.84-4.169-.12-.375-.491-.596-.781-.596-.146 0-.272.056-.333.179-.182.363.459.417.677.308.706.321 1.156 3.519 1.254 4.277-.125-.006-.199.035-.199.233 0 .311.17.756.452.843a.442.442 0 0 0-.007.03s-.287.99-.413 2.189a4.665 4.665 0 0 1-.718-.225c-.714-.286-1.355-.583-2.019-.566-.664.018-1.366.023-1.804-.036-.438-.058-.649-.15-.649-.15s-.234.365.257 1.075c.42.607 1.055 1.047 1.644 1.18.589.134 1.972.18 2.785-.377.16-.109.317-.228.459-.34a8.717 8.717 0 0 0-.013.626c-.289.753-.571 1.993-.268 3.338 0-.001.701-.842.787-2.958.006-.144.009-.271.01-.383.052-.248.103-.518.148-.799.072.135.151.277.234.413.511.842 1.791 1.37 2.383 1.49.091.019.187.032.285.038Zm-1.12.745c-.188.055-.445.1-.713.059-.21-.031-.45-.11-.655-.316-.169-.168-.312-.419-.401-.789a9.837 9.837 0 0 0 .039-.82l.049-.243c.563.855 1.865 1.398 2.476 1.522.036.008.072.014.109.02l-.013.009c-.579.415-.76.503-.891.558Zm6.333-2.818c-.257.114-4.111 1.822-5.246 2.363.98-.775 3.017-3.59 3.699-4.774 1.062.661 1.468 1.109 1.623 1.441.101.217.09.38.096.515a.57.57 0 0 1-.172.455Zm-9.213 1.62a1.606 1.606 0 0 1-.19.096c-.954.414-2.126.61-4.728-.571-2.023-.918-3.024-2.157-3.371-2.666.476.161 1.471.473 2.157.524.282.021.703.068 1.167.125.021.209.109.486.345.829l.001.001c.451.651 1.134 1.119 1.765 1.262.622.141 2.083.182 2.942-.407a3.12 3.12 0 0 0 .132-.093l.001.179a6.052 6.052 0 0 0-.221.721Zm5.512-1.271a17.49 17.49 0 0 1-1.326-.589c.437.042 1.054.083 1.692.108-.121.162-.244.323-.366.481Zm.932-1.26c-.12.17-.245.343-.373.517-.241.018-.478.03-.709.038a29.05 29.05 0 0 1-.741-.048c.608-.065 1.228-.252 1.823-.507Zm.22-.315c-.809.382-1.679.648-2.507.648-.472 0-.833.018-1.139.039v.001c-.324-.031-.665-.039-1.019-.054a3.555 3.555 0 0 1-.152-.009c.102-.002.192-.006.249-.006.363 0 1.662.034 3.151-.589 1.508-.632 2.645-1.773 3.136-3.351.37-1.186.31-2.402.086-3.312.458-.336.86-.651 1.147-.91.501-.451.743-.733.848-.869.199.206.714.864.685 2.138-.036 1.611-.606 3.187-1.501 4.154a9.099 9.099 0 0 1-1.321 1.132 11.978 11.978 0 0 0-.644-.422l-.089-.055-.051.091c-.184.332-.5.825-.879 1.374ZM4.763 5.817c-.157 1.144.113 2.323.652 3.099.539.776 2.088 2.29 3.614 2.505.991.14 2.055.134 2.055.134s-.593-.576-1.114-1.66c-.521-1.085-.948-2.104-1.734-2.786-.785-.681-1.601-1.416-2.045-1.945-.444-.53-.59-.86-.59-.86s-.656.175-.838 1.513Zm14.301 4.549a9.162 9.162 0 0 0 1.3-1.12c.326-.352.611-.782.845-1.265 1.315.145 2.399.371 2.791.434 0 0-.679 1.971-3.945 3.022l-.016-.035c-.121-.26-.385-.594-.975-1.036Zm-11.634.859a8.537 8.537 0 0 1-.598-.224c-1.657-.693-2.91-1.944-3.449-3.678-.498-1.601-.292-3.251.091-4.269.225.544.758 1.34 1.262 2.01a3.58 3.58 0 0 0-.172.726c-.163 1.197.123 2.428.687 3.24.416.599 1.417 1.62 2.555 2.193-.128.002-.253.003-.376.002Zm-1.758-.077c-.958-.341-1.901-.787-2.697-1.368C-.07 7.559 0 6.827 0 6.827s1.558-.005 3.088.179c.03.126.065.251.104.377.557 1.791 1.851 3.086 3.562 3.803l.047.019a4.254 4.254 0 0 1-.267-.026h-.001c-.401-.053-.595-.135-.595-.135l-.157-.069-.092.144-.017.029Zm6.807-1.59c.086.017.136.058.136.145 0 .197-.242.5-.597.597l-.01-.161a.887.887 0 0 0 .283-.243c.078-.099.142-.217.188-.338Zm-1.591.006c.033.1.076.197.129.282.061.097.134.18.217.24l-.021.083c-.276-.093-.424-.293-.424-.466 0-.078.035-.119.099-.139Zm-.025-.664c-.275-.816-.795-2.022-1.505-2.179-.296.072-.938.096-.691-.145.246-.24 1.085-.048 1.283.217.145.194.744.806 1.011 1.737l.032.227a.324.324 0 0 0-.13.143Zm1.454-.266c.251-.99.889-1.639 1.039-1.841.197-.265 1.036-.457 1.283-.217.247.241-.395.217-.691.145-.69.152-1.2 1.296-1.481 2.109a.364.364 0 0 0-.067-.059.37.37 0 0 0-.092-.043l.009-.094Zm4.802-2.708a9.875 9.875 0 0 1-.596.705c-.304.315-1.203 1.176-1.963 1.916.647-.955 1.303-1.806 2.184-2.376.123-.08.249-.161.375-.245Z"/></svg>
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "../../..", "features": ["content.tooltips", "search.highlight", "navigation.tabs", "navigation.indexes", "navigation.prune"], "search": "../../../assets/javascripts/workers/search.b8dbb3d2.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script>
<script src="../../../assets/javascripts/bundle.fe8b6f2b.min.js"></script>
</body>
</html>