<!DOCTYPE html>
<html>
<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">
<link rel="shortcut icon" href="../../img/favicon.ico">
<title>Functions — Luna Docs</title>
<link rel="stylesheet" href="//fonts.googleapis.com/css?family=Lato:400,700">
<link rel="stylesheet" href="//cdn.jsdelivr.net/gh/tonsky/FiraCode@1.206/distr/fira_code.css">
<link rel="stylesheet" href="//use.fontawesome.com/releases/v5.8.1/css/all.css">
<link rel="stylesheet" href="//use.fontawesome.com/releases/v5.8.1/css/v4-shims.css">
<link rel="stylesheet" href="../../css/theme.css">
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css">
<script src="//code.jquery.com/jquery-2.1.1.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
<script>
hljs.initHighlightingOnLoad();
</script>
</head>
<body ontouchstart="">
<div id="container">
<aside>
<div class="home">
<div class="title">
<button class="hamburger"></button>
<a href="../.." class="site-name"> Luna Docs</a>
</div>
<div class="search">
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" title="Type search term here" />
</form>
</div>
</div>
</div>
<nav class="nav">
<ul class="root">
<li class="toctree-l1"><a class="nav-item" href="../..">Home</a><a class="nav-item" href="../..">Home</a></li>
<li class="toctree-l1"><button class="section nav-item">Getting Started</button>
<ul class="subnav">
<li class="toctree-l2"><a class="nav-item" href="../../getting_started/installation/">Installation</a></li>
<li class="toctree-l2"><a class="nav-item" href="../../getting_started/environment/">Environment</a></li>
</ul></li>
<li class="toctree-l1"><button class="section nav-item">Guide</button>
<ul class="subnav">
<li class="toctree-l2"><a class="nav-item" href="../grammar/">Grammar</a></li>
<li class="toctree-l2"><a class="nav-item" href="../statements/">Statements</a></li>
<li class="toctree-l2"><a class="nav-item" href="../expressions/">Expressions</a></li>
<li class="toctree-l2"><a class="nav-item" href="../basic-values/">Basic Values</a></li>
<li class="toctree-l2"><a class="nav-item" href="../variables/">Variables</a></li>
<li class="toctree-l2"><a class="nav-item" href="../objects/">Objects</a></li>
<li class="toctree-l2 current"><a class="nav-item current" href="./">Functions</a>
<ul class="subnav">
<li class="toctree-l3"><a class="nav-item toc" href="#upvalues">UpValues</a></li>
</ul></li>
</ul></li>
<li class="toctree-l1"><button class="section nav-item">Standard Modules</button>
<ul class="subnav">
<li class="toctree-l2"><a class="nav-item" href="../../standard_modules/globals/">Globals</a></li>
<li class="toctree-l2"><button class="section nav-item hide">Type Modules</button>
<ul class="subnav hide">
<li class="toctree-l3"><a class="nav-item" href="../../standard_modules/type_modules/int_module/">Int Module</a></li>
<li class="toctree-l3"><a class="nav-item" href="../../standard_modules/type_modules/float_module/">Float Module</a></li>
<li class="toctree-l3"><a class="nav-item" href="../../standard_modules/type_modules/bool_module/">Bool Module</a></li>
<li class="toctree-l3"><a class="nav-item" href="../../standard_modules/type_modules/char_module/">Char Module</a></li>
<li class="toctree-l3"><a class="nav-item" href="../../standard_modules/type_modules/string_module/">String Module</a></li>
<li class="toctree-l3"><a class="nav-item" href="../../standard_modules/type_modules/vector_module/">Vector Module</a></li>
<li class="toctree-l3"><a class="nav-item" href="../../standard_modules/type_modules/object_module/">Object Module</a></li>
</ul></li>
<li class="toctree-l2"><a class="nav-item" href="../../standard_modules/math/">Math</a></li>
<li class="toctree-l2"><a class="nav-item" href="../../standard_modules/io/">IO</a></li>
<li class="toctree-l2"><a class="nav-item" href="../../standard_modules/fs/">FS</a></li>
<li class="toctree-l2"><a class="nav-item" href="../../standard_modules/env/">Env</a></li>
<li class="toctree-l2"><a class="nav-item" href="../../standard_modules/net/">Net</a></li>
<li class="toctree-l2"><a class="nav-item" href="../../standard_modules/os/">OS</a></li>
<li class="toctree-l2"><a class="nav-item" href="../../standard_modules/typed/">Typed</a></li>
</ul></li>
</ul>
</nav>
<div class="repo">
<div class="previous"><a href="../objects/">« Previous</a></div>
<div class="next"><a href="../../standard_modules/globals/">Next »</a></div>
</div>
</aside>
<div id="spacer"><button class="arrow"></button></div>
<main>
<div class="home-top">
<button class="hamburger"></button>
<a href="../.." class="site-name"> Luna Docs</a>
</div>
<div id="main">
<nav class="breadcrumbs">
<ul>
<li>Guide</li>
</ul>
</nav>
<div id="content"><h1 id="functions">Functions</h1>
<p>Functions in Luna are first-class values, which means they can be passed around like any other native value type. A function consists of a closure reference and an <a href="#upvalues">UpValue</a> list. A normal code Chunk is also just a function, that gets executed immediatly after compilation.</p>
<pre><code>let fn add(a, b) {
return a + b
}
print(add(1, 2))
</code></pre>
<p>This code generates two closures (code instance that can reference other closures), one is the <em>main</em> closure, and the other is the <code>add</code> function. The <em>main</em> closure has a reference to the <code>add</code> closure, because it needs to assign it to the local <code>add</code> variable as a function referencing that closure (note that this function has no upvalues).</p>
<h2 id="upvalues">UpValues</h2>
<p>UpValues are an important concept in Luna, as they let functions keep references to values even though their scope is not active anymore. The best example is a counter function.</p>
<pre><code>let fn counter() {
count = 1
return fn () {
count += 1
return count
}
}
</code></pre>
<p>This function called <code>counter</code> returns a function that references a closure, but also has to keep a reference to the value saved in <code>count</code>, because it uses it to increment it's counting value. The compiler automatically infers that the <code>count</code> variable from the outer scope is being referenced here, so it saves a copy to it's reference. Because Luna has a reference-counting garbage collector, the reference will not be invalid after the <code>counter</code> function is done executing. If it weren't referenced, the <code>count</code> variable would be dropped from memory. As long as the function still exists, this value reference exists too. The reference is also never the same for each call to <code>counter</code>.</p>
<pre><code>let c1 = counter() # function with a unique reference to `count`
let c2 = counter() # another function with a unique reference to another `count`
</code></pre>
<p>Here we have to different functions being assigned to <code>c1</code> and <code>c2</code>. Both functions reference the same closure, but not the same <code>count</code> value. This allows multiple counters to exist in this program making the following code work like you would expect:</p>
<pre><code>print(c1()) # 1
print(c1()) # 2
print(c1()) # 3
print(c2()) # 1
print(c2()) # 2
print(c2()) # 3
</code></pre></div>
<footer>
<div class="footer-buttons">
<div class="previous"><a href="../objects/" title="Objects"><span>Previous</span></a></div>
<div class="next"><a href="../../standard_modules/globals/" title="Globals"><span>Next</span></a></div>
</div>
<div class="footer-note">
<p>
Built with <a href="http://www.mkdocs.org">MkDocs</a> using
<a href="https://github.com/daizutabi/mkdocs-ivory">Ivory theme</a>.
</p>
</div>
</footer>
</div>
</main>
</div>
<script>var base_url = '../..';</script>
<script src="../../js/theme.js"></script>
<script src="../../search/main.js"></script>
</body>
</html>