luna-lib 1.3.0

a light weight interpreted programming language
Documentation
<!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 &mdash; 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/">&laquo; Previous</a></div>
    <div class="next"><a href="../../standard_modules/globals/">Next &raquo;</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>