Appearance
Limitations
What Tilde does not do yet, and what it does quietly rather than loudly. Written so you can tell a bug from a gap.
Anything here is a gap. If Tilde does something not described on this page and not described elsewhere in the docs, that is worth reporting.
Answers chosen for you
A drawing has to start somewhere, and when a figure is genuinely ambiguous something has to settle on one version of it. Both are choices your program did not make, and both are invisible in the result.
point a at 0 0
point b
line l through a bOnly a is actually determined here. b is placed at the origin because nothing says otherwise, and the line through two identical points comes out at an arbitrary angle.
To see which parts are yours: switch the strategy picker in the playground to none. It draws only what your constraints force, and leaves out everything that was being chosen for you.
Contradictions are quiet
Asking for something impossible does not stop the drawing or report anything. The impossible part is left out and the rest is drawn.
scalar r = 2
r = 3 -- r cannot be both, so it has no value and is not drawnNothing marks it as impossible on the canvas. You find out by noticing something missing.
Ambiguous figures
Where a figure has two possible versions, Tilde draws and prints both. There is no way yet to choose one — pick went with the classic syntax and is on the roadmap. Saying something more that rules one out is the only way to settle it.
The language
How a line is read is described in Reading a Line.
Not available at all: pick, units, angles, lines by equation, and the other things that went with the classic syntax — listed on the roadmap.
Arithmetic works only on numbers written out. scalar r = ((2 + 3) * 4) is 20, but (k + 1) with a named k is refused — a named number is worked out after the arithmetic runs, so there is nothing to add yet.
Where anything would do, a two-way group has to be named first. If a pair of numbers can mean a point or a line, the slot it lands in decides — but print takes anything, so print (2, 1) is refused until the pair is named (point p = (2, 1), then print p). = cannot pass a type across from one side to the other yet either.
You can reach a shape's parts but not a shape's numbers. t.point1 gives you a triangle's corner, because a corner is a whole point. There is no p.x — see the roadmap for why that is harder than it looks.
Two points said to be the same stay two points. p = q holds them at no distance apart, drawn on top of each other, rather than making them one point — that waits on = learning to merge. (Two numbers, r = w, already are one.)
A definition's helper shapes are not drawn. A name used only inside a definition ends when the definition finishes, and so does any way of showing what it named. The shape still counts — if it holds something else in place, that still holds — but it does not appear. To show a part of what a definition builds, make it a field of the thing's type, or build it under the name the caller supplied. A way to ask for a helper to be drawn is planned.
A definition can only use what its own file imported. Importing a file does not give you what it imported. This is deliberate, and matches how most languages work, but it means a shape you got from elsewhere may not be one you can say anything about without importing more.