content/articles/glyph-050-released.glyph
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 108 109 110 111 112 113 114 115 116 |
-----
:type: article
:tags:
- glyph
- ruby
- opensource
:permalink: glyph-050-released
:title: "Glyph 0.5.0 Released"
:subtitle: Featuring Calibre integration, macro composition, Turing-completeness, and more
:pdf: false
:date: 2011-08-28 21:18:00.000000 +02:00
:intro: |
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!
:extended_intro: |
This new release was mainly focused on extending the features of Glyph as a _language_. 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.
Additionally, it also features enhanced content reuse through fragments and output-independent macros, and a few bugfixes.
-----
$[document.intro]
§[
@title[Calibre Integration]
txt[
=>[https://github.com/tammycravit|Tammy Cravit] proposed (and more or less implemented) an interesting new feature: integrate =>[http://calibre-ebook.com/|Calibre] to generate ebooks in EPUB and MOBI format from Glyph's native standalone HTML output format.
Although the support is still somewhat rough, you can, as a matter of fact, generate ebooks with Glyph, using Calibre.
]
]
§[
@title[Macro Composition]
txt[
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:
]
highlight[=html|
?[
not[output?[pdf]]\|
...
]
=]
p[Can be written like this:]
highlight[=html|
?[
not/output?[pdf]\|
...
]
=]
txt[
In this case, the @not@ macro was composed with the @output?@ macro, thus removing one level of nesting.
Additionally, I used this features to create an @xml@ macro dispatcher that can be used to render raw XML tags, and an @s@ 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]=] and similar.
]
]
§[
@title[Turing-Completeness]
txt[
As of this version, Glyph can be considered _Turing-complete_, as it satisfies the following =>[http://c2.com/cgi/wiki?LanguageRequirementsForTuringCompleteness|requirements for Turing-completeness]:
* A conditional construct, implemented via the @condition@ macro.
* Variable assignment, by setting the value of snippets using the @snippet:@ macro and of attributes using the @attribute:@ macro.
* (infinite) iteration implemented through the new @while@ macro or recursion, which is possible thanks to the new @define:@ macro.
* A memory model which emulates an infinite store: there are no enforced limits on attribute/snippets allocations and number of algorithms or parameters.
Plus, Glyph now understand basic integer arithmetic:
]
highlight[=html|
def:[factorial\|
?[
eq[{{0}}\|0]\|1\|
multiply[
{{0}} \| factorial[subtract[{{0}}\|1]]
]
]
]
=]
txt[
Not that you _need_ to be able to calculate factorials in your documents, but know that now you _can_. An you can also define lexically scoped variables, err... _attributes_, like this:
]
highlight[=html|
let[
@:[a\|bits]
@:[b\|bobs]
section[
@title[Something more about attributes]
Attributes are like lexically scoped variables. You can use them to store @[a] and @[b].
]
]
=]
p[Handy enough.]
]
§[
@title[Embeddable fragments]
txt[
Too lazy to create snippets? Feel the urge to re-use something you already wrote somewhere? Use a _fragment_ and embed it, as follows:
]
highlight[=html|
Snippets and fragments ##[good_way\|are a good way to reuse] small chunks of content,
while the include and load macros <=[good_way] entire files.
=]
txt[...And you can also use a new @load@ macro, to embed entire files without performing any evaluation (like @include@ does).]
]
§txt[
@title[Incompatibilities with previous versions]
To sum up:
* @snippets.yml@ is no more, define all your snippets inside your document instead.
* New "invisible space separator": @\\/@ instead of @\\.@. Because it's slightly prettier, nothing else.
* The @rewrite:@ macro has been replaced by the @define:@ macro, which also allows recursion, so be careful!
* If you want to render raw XML tags, use @xml/tag_name@ instead of @=tag_name@.
* No more @match@ macro, use @s/match@ instead.
For the full list of the issues fixed in this release, see the =>[http://www.h3rald.com/glyph/book/changelog.html|Changelog].
Hope you'll enjoy this new release of Glyph. If you want to contribute, go ahead and =>[https://github.com/h3rald/glyph|fork the repo]!
]
|