The programming language XL is our implementation of relational growth grammars. XL is built on top of the programming language Java: This combines the advantages of the rule-based paradigm with the strength of Java, including the rich set of existing Java libraries.
Rules are specified within a transformation statement. The snowflake curve can be generated by the two rules:
Axiom ==> F(1) RU(120) F(1) RU(120) F(1); F(x) ==> F(x/3) RU(-60) F(x/3) RU(120) F(x/3) RU(-60) F(x/3);
Behind the scenes, Axiom, F and RU correspond to Java classes of that name. The bound variable x corresponds to a field of class F.
XL supports expressions that have multiple values successively. E.g., the expression (* F *) returns all existing objects of class F. Operators like sum perform calculations on those expressions. To get the total length of all F‘s having a diameter greater than one, just write
sum ((* f:F, (f.diameter > 1) *).length)
Especially the graph query expressions of the form (* … *) enable you to specify local or global interactions in a concise and expressive way.
You can find many examples of the XL languages in the gallery.
An extensive documentation on the XL language specification can be found on the grogra website.
As XL is based on Java, some coding rules are the same.
For instance, functions are declared with a modifier (public, protected, private,…), a return type (int, void, …), the function name and the parameters in parenthesis.
Similarly, variables are declared with a type, which is identical to the Java types.