This is a work-in-progress redevelopment of Flitter in Rust. It is as much a playground for trying new ideas as a concerted effort to reimplement the language and so is in a state of permanent flux. I am introducing breaking changes to the language along the way. Here be dragons.
Find a file
2025-09-15 22:04:47 +01:00
flitter-core Fairly hefty set of changes making ranges a value type 2025-09-15 22:04:47 +01:00
flitter-macros Fairly hefty set of changes making ranges a value type 2025-09-15 22:04:47 +01:00
.gitignore Probably don't want to be committing that 2025-03-10 20:50:17 +00:00
.rustfmt.toml Experiments 2025-03-10 18:12:57 +00:00
Cargo.toml A significant number of changes towards a functioning VM 2025-03-13 16:37:18 +00:00
README.md Fairly hefty set of changes making ranges a value type 2025-09-15 22:04:47 +01:00

Language changes from Flitter 1

Columns

Vectors may now include numeric "columns", which allows both for matrices and neater processing of structured data, like vectors of points or colours. Columns are created with the {…} operator, which will only accept a numeric vector as input. Vectors of columns with the same height are optimised into a matrix. Existing indexing, iterating and let de-structuring expressions treat columns as individual values. Applying the same {…} syntax around a name-list allows for de-structuring a column, e.g.:

let p = {0;1};{2;3}
let {x;y} = p[1]

will bind x to 2 and y to 3.

New expansion rules apply for columns: the height of the result of a numeric binary operation will be the maximum of the heights of the operands, and the shorter operand is wrapped in both dimensions. So with:

let x = {0;1;2};{3;4;5};{6;7;8}
    y = 1;2
    z = {1;2}

x + y will be {1;2;3};{5;6;7};{7;8;9} and x + z will be {1;3;3};{4;6;6};{7;9;9}.

Mixed-height vectors are supported, just as mixed type vectors are still supported. However, mixed-height vectors are less efficiently stored and are not considered to be "numeric" for the purposes of mathematical operations. Indexing/de-structuring can be used to extract fully numeric vectors.

Mathematical operations

The % operator is now a C-style remainder, %% is "proper" modulo. These are intended to pair visually with the / and // division operators.

As most extant Flitter modulo-arithmetic code doesn't involve negative numbers, this is probably not a breaking change for most code.

Comparison operations

All comparison operations are now piece-wise instead of operating on whole vectors. Equality, inequality and greater/lesser comparisons will evaluate to vectors of true/false values. Expansion rules apply for vectors of different lengths and/or heights.

New any and all prefix operators collapse a vector of truth values into a single truth value. In the absence of the explicit use of one of these, the default boolean value of a vector (for if, and, or, etc.) is all. This is a change from Flitter 1 where the default was effectively any.

There are unlikely to be many places where comparison operators were used on non-scalar values, so this should hopefully not be a significant problem. The change to all instead of any default logic may cause issues.

(To be precise, all will always return a truth value, any actually returns the first non-false value from its input vector or null otherwise.)

Attributes

Attributes are now an ordered sequence of named values and nodes do not impose uniqueness on the names. So a name may be repeated multiple times with different values. It is up to the renderers to decide how to interpret any repeated attributes. In general, it is expected that most renderers will use the last value, which effectively maintains the previous behaviour. However, there are places where it will be more useful to take all attributes in order. For example, the !transform node could then apply multiple transforms of the same kind, such as a translation, followed by a rotation and then another translation.

Useful links

  • winit - a cross-platform windowing library
  • wgpu - a portable (including WASM/browser) WebGPU API
  • vello - a 2D drawing API that sits on top of wgpu
  • color - a color space conversions library