Layouts
There are four different kind of layout definitions in TreeLDR:
Empty Layout
The empty layout is defined by simply declaring the name of the layout directly followed by a semicolon.
// Empty layout.
layout MyLayout for MyType;
Structure Layout
A structure layout is a list of fields each bound to a property of the layout's type.
// Structure layout.
layout MyLayout for MyType {
property1 as fieldName1: Layout1,
// ...
propertyN as fieldNameN: LayoutN
}
The layout of each field is specified after a colon :
using a layout expression.
Enumeration Layout
[To Do]
Layout Alias
Lastly, it is possible to define layout aliases. Such a layout is defined using a layout expression.
layout MyLayout = LayoutExpression;
Layout Expression
A layout expression is a composition of existing layouts by union, intersection, and restriction.
Union
The union between two or more layouts is expressed using the |
operator.
LayoutA | ... | LayoutN
Under the hood, this implicitly defines an enumeration layout.
Intersection
The intersection between two or more layouts is expressed using the &
operator.
LayoutA & ... & LayoutN
Range Restriction
Range restrictions are used to select a subset of a layout by restricting the range of one of its fields. Just like with types, there are two kinds of range restrictions: universal and existential.
A universal range restriction is built using the all
keyword:
all someProperty as fieldName: RestrictedLayout
This denotes the layout of all instances such that all values of fieldName
are instances of RestrictedLayout
.
Similarly, the existential range restriction is built using the any
keyword:
any someProperty as fieldName: RestrictionLayout
This denotes the layout of all instances such that at least one value of fieldName
is an instance of RestrictedLayout
.
Range restrictions are usually part of an intersection:
Layout & all someProperty as fieldName: RestrictionLayout
Last updated
Was this helpful?