contents/articles/glyph-050-released.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 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
----- title: "Glyph 0.5.0 Released" content-type: article subtitle: "Featuring Calibre integration, macro composition, Turing-completeness, and more" timestamp: 1314559080 tags: "glyph|ruby|opensource" ----- <section class="section"> <p>Too much time passed since the last Glyph release. Way too much. Finally I found the time and will to tidy up the last few remaining bugs, update the docs, and release it!</p> <p>This new release was mainly focused on extending the features of Glyph as a <em>language</em>. Besides a few improvements that make writing Glyph code easier and more readable (e.g. macro composition), Glyph is now Turing-complete. It supports iterations, recursion, variable assignments, basic arithmetics… you can even write a program to compute the factorial of an integer, if you wanted to.</p> <p>Additionally, it also features enhanced content reuse through fragments and output-independent macros, and a few bugfixes.</p> <section class="section"> <header><h1 id="h_1" class="toc">Calibre Integration</h1></header> <p><a href="https://github.com/tammycravit">Tammy Cravit</a> proposed (and more or less implemented) an interesting new feature: integrate <a href="http://calibre-ebook.com/">Calibre</a> to generate ebooks in <span class="caps">EPUB</span> and <span class="caps">MOBI</span> format from Glyph’s native standalone <span class="caps">HTML</span> output format.</p> <p>Although the support is still somewhat rough, you can, as a matter of fact, generate ebooks with Glyph, using Calibre.</p> </section> <section class="section"> <header><h1 id="h_2" class="toc">Macro Composition</h1></header> <p>This release features an update at syntax-level: the possibility of “composing” macros, thereby eliminating nesting provided that containers take only one parameter and no attributes. What? This:</p> <div class="CodeRay"> <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span>?[ <span class="line-numbers"><a href="#n2" name="n2">2</a></span> not[output?[pdf]]| <span class="line-numbers"><a href="#n3" name="n3">3</a></span> ... <span class="line-numbers"><a href="#n4" name="n4">4</a></span>]</pre></div> </div> <p>Can be written like this:</p> <div class="CodeRay"> <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span>?[ <span class="line-numbers"><a href="#n2" name="n2">2</a></span> not/output?[pdf]| <span class="line-numbers"><a href="#n3" name="n3">3</a></span> ... <span class="line-numbers"><a href="#n4" name="n4">4</a></span>]</pre></div> </div> <p>In this case, the <code>not</code> macro was composed with the <code>output?</code> macro, thus removing one level of nesting.</p> <p>Additionally, I used this features to create an <code>xml</code> macro dispatcher that can be used to render raw <span class="caps">XML</span> tags, and an <code>s</code> macro dispatcher that basically is able to call nearly all the instance methods of the Ruby String class. So you can write things like <code>s/sub[This feature makes my life easier|/my/|your]</code> and similar.</p> </section> <section class="section"> <header><h1 id="h_3" class="toc">Turing-Completeness</h1></header> <p>As of this version, 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 <code>condition</code> macro.</li> <li>Variable assignment, by setting the value of snippets using the <code>snippet:</code> macro and of attributes using the <code>attribute:</code> macro.</li> <li>(infinite) iteration implemented through the new <code>while</code> macro or recursion, which is possible thanks to the new <code>define:</code> 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> <p>Plus, Glyph now understand basic integer arithmetic:</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>Not that you <em>need</em> to be able to calculate factorials in your documents, but know that now you <em>can</em>. An you can also define lexically scoped variables, err… <em>attributes</em>, like this:</p> <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>Handy enough.</p> </section> <section class="section"> <header><h1 id="h_4" class="toc">Embeddable fragments</h1></header> <p>Too lazy to create snippets? Feel the urge to re-use something you already wrote somewhere? Use a <em>fragment</em> and embed it, as follows:</p> <div class="CodeRay"> <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span>Snippets and fragments ##[good_way|are a good way to reuse] small chunks of content, <span class="line-numbers"><a href="#n2" name="n2">2</a></span>while the include and load macros <span class="error"><</span>=[good_way] entire files.</pre></div> </div> <p>…And you can also use a new <code>load</code> macro, to embed entire files without performing any evaluation (like <code>include</code> does).</p> </section> <section class="section"> <header><h1 id="h_5" class="toc">Incompatibilities with previous versions</h1></header> <p>To sum up:</p> <ul> <li><code>snippets.yml</code> is no more, define all your snippets inside your document instead.</li> <li>New “invisible space separator”: <code>\/</code> instead of <code>\.</code>. Because it’s slightly prettier, nothing else.</li> <li>The <code>rewrite:</code> macro has been replaced by the <code>define:</code> macro, which also allows recursion, so be careful!</li> <li>If you want to render raw <span class="caps">XML</span> tags, use <code>xml/tag_name</code> instead of <code>=tag_name</code>.</li> <li>No more <code>match</code> macro, use <code>s/match</code> instead.</li> </ul> <p>For the full list of the issues fixed in this release, see the <a href="http://www.h3rald.com/glyph/book/changelog.html">Changelog</a>.</p> <p>Hope you’ll enjoy this new release of Glyph. If you want to contribute, go ahead and <a href="https://github.com/h3rald/glyph">fork the repo</a>!</p> </section> </section> |