content/glyph/book/text_editing/evaluation.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
-----
permalink: t_22
title: Glyph – Simple Programming and Code Evaluation
type: page
-----
<nav class="navigation"><a href="/glyph/book/text_editing/conditionals.html">← Conditional Macros</a> | <a href="/glyph/book/index.html">Contents</a> | <a href="/glyph/book/compiling/compiling.html">Compiling a project →</a></nav>
<section class="section">
<header><h1 id="h_44" class="toc">Turing-completeness</h1></header>
<p>As of version 0.5.0, Glyph can be considered <em>Turing-complete</em>, as it satisfies the following <a href="http://c2.com/cgi/wiki?LanguageRequirementsForTuringCompleteness">requirements for Turing-completeness</a>:</p>
<ul>
<li>A conditional construct, implemented via the <a href="/glyph/book/macros/macros_core.html#m_condition"><code>condition</code></a> macro.</li>
<li>Variable assignment, by setting the value of snippets using the <a href="/glyph/book/macros/macros_core.html#m_snippet_"><code>snippet:</code></a> macro and of attributes using the <a href="/glyph/book/macros/macros_core.html#m_attribute_"><code>attribute:</code></a> macro.</li>
<li>(infinite) iteration implemented through the <a href="/glyph/book/macros/macros_core.html#m_while"><code>while</code></a> macro or recursion, which is possible thanks to the <a href="/glyph/book/macros/macros_core.html#m_define_"><code>define:</code></a> macro.</li>
<li>A memory model which emulates an infinite store: there are no enforced limits on attribute/snippets allocations and number of algorithms or parameters.</li>
</ul>
</section>
<section class="section">
<header><h1 id="h_45" class="toc">Operations on integer values</h1></header>
<p>Glyph can be used to perform operation on integer values (additions, subtractions and multiplications). For example, <code>add[2|3|7]</code> will evaluate to @12@, and <code>multiply[add[3|7]|subtract[5|1|2]]</code> will return 20.</p>
<p>As a more complex example, consider the following @factorial@ macro, which is able to calculate the factorial of a number recursively:</p>
<div class="CodeRay">
<div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span>def:[factorial|
<span class="line-numbers"><a href="#n2" name="n2">2</a></span> ?[
<span class="line-numbers"><a href="#n3" name="n3">3</a></span> eq[{{0}}|0]|1|
<span class="line-numbers"><a href="#n4" name="n4">4</a></span> multiply[
<span class="line-numbers"><a href="#n5" name="n5">5</a></span> {{0}} | factorial[subtract[{{0}}|1]]
<span class="line-numbers"><a href="#n6" name="n6">6</a></span> ]
<span class="line-numbers"><a href="#n7" name="n7">7</a></span> ]
<span class="line-numbers"><a href="#n8" name="n8">8</a></span>]</pre></div>
</div>
<p>If you try executing <code>factorial[5]</code>, it will evaluate to @120@.</p>
</section>
<section class="section">
<header><h1 id="h_46" class="toc">Lexically-scoped attribute assignment</h1></header>
<p><a href="/glyph/book/text_editing/inclusions.html#snippets">Snippets</a> can be used in a similar way as <em>variables</em> are used in programming languages. Or better, they can be used as <em>global variables</em>, as they are visible from anywhere in the Glyph document. If you need something more restricted to, say, a section and all its subsections, you can define your own attributes and use them in a very similar way.</p>
<p>Consider the following Glyph code:</p>
</section>
<div class="CodeRay">
<div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span>let[
<span class="line-numbers"><a href="#n2" name="n2">2</a></span> @:[a|bits]
<span class="line-numbers"><a href="#n3" name="n3">3</a></span> @:[b|bobs]
<span class="line-numbers"><a href="#n4" name="n4">4</a></span> section[
<span class="line-numbers"><a href="#n5" name="n5">5</a></span> @title[Something more about attributes]
<span class="line-numbers"><a href="#n6" name="n6">6</a></span>Attributes are like lexically scoped variables. You can use them to store @[a] and @[b].
<span class="line-numbers"><a href="#n7" name="n7">7</a></span> ]
<span class="line-numbers"><a href="#n8" name="n8">8</a></span>]</pre></div>
</div>
<p>The <a href="/glyph/book/macros/macros_core.html#m_let"><code>let</code></a> macro here only acts as a dummy macro (it does nothing really) to bind attributes using the <a href="/glyph/book/macros/macros_core.html#m_attribute_"><code>attribute:</code></a> macro (aliased by <code>@:</code>). Attributes can then be used anywhere within the <code>let</code> macro, so the content of the section reads: “Attributes are like lexically-scoped variables. You can use them to store bits and bobs”.</p>
<p>Note that attributes defined through the <a href="/glyph/book/macros/macros_core.html#m_attribute_"><code>attribute:</code></a> macro are… well, attributes! Feel free to use the <a href="/glyph/book/macros/macros_core.html#m_attribute"><code>attribute</code></a> macro to access standard attributes like <code>title</code>, etc.</p>
<section class="section">
<header><h1 id="h_47" class="toc">Evaluating Ruby code</h1></header>
<p>For anything more complex than what described in the previous sections you can also evaluate simple ruby code snippets using the <code>ruby</code> macro (aliased to <code>%</code>), like this:</p>
<ul>
<li><code>%[2 + 2]</code> → 4</li>
<li><code>%[Time.now]</code> → 2013-12-26 22:50:28 +0100</li>
<li><code>%[Glyph::VERSION]</code> → 0.5.2</li>
</ul>
<p>The scope for the code evaluation is the Kernel module, (with all inclusions required by Glyph itself).</p>
<p>Although it is possible to retrieve Glyph configuration settings in this way (e.g. <code>%[cfg('document.author')]</code>), the <a href="/glyph/book/macros/macros_core.html#m_config"><code>config</code></a> macro (aliased to <code>$</code>) makes things slightly simpler (e.g. <code>$[document.author]</code>).</p>
</section>
<nav class="navigation"><a href="/glyph/book/text_editing/conditionals.html">← Conditional Macros</a> | <a href="/glyph/book/index.html">Contents</a> | <a href="/glyph/book/compiling/compiling.html">Compiling a project →</a></nav>
|