- `[a, b, c]` list literals (E_LIST → emit_list); static_type learns slice-element, `new T`, list, string and literal kinds - `x op= y` lowers through the same path as `x = x op y` (emit_bin_vals): fixed `*=`/`/=` use the Q16.16 64-bit paths, string `+=` concatenates, int→long widens; unary `-` keeps a fixed operand's type (arith_ty) - one `unescape()` table for "strings", 'chars' and `interpolation`; `'\''`, `'\\'`, `'\"'` no longer read as 0; unterminated char literals and unexpected characters are errors instead of silently skipped - every diagnostic is `file:line: error: msg` (g_parse_file / g_err_file, Node.file + Node.line set by node()); tok_desc() in expectation errors; duplicate `function` names and unknown `phase` names are reported in source terms (phase_id used to default unknown phases to Overlay) - interpolation holes skip braces inside string literals - hand-IR preludes move from the user `@fn_` prefix to `@lp_` so a user `is_ws` / `str_eq` / `path_join` no longer collides at link time - `@ClearColor(expr)` accepts any constant expression; `Os.pid()` added (docs page + inventory); `str_starts()` in support/str - main.ludic: `else if` flag ladder, char literals, stale script comments - examples/lang/operators.ludic covers all of the above; os.ludic covers Os.pid; docs pages for Os.pid and the Overlay phase; ten changesets - reseeded: selfhost/ludicc.seed.ll is the new compiler's own fixpoint Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
1.7 KiB
1.7 KiB
| id | name | category | kind | tokens | sig | tip | order |
|---|---|---|---|---|---|---|---|
| kw-ui | ui | structure | keyword | ui | ui { panel { … } } | Declare a retained widget tree as data; the engine lays it out and draws it. | 50 |
A ui block declares a retained widget tree as data — panels, labels and buttons — and hands layout, drawing and keyboard focus to the engine, so you describe the interface once instead of repainting it every frame. Widget types are panel (a container with optional skin/background/border), col/row (pure stacks), label, button (focusable), image and spacer, and their props are evaluated at build time, so font: title_font reads a value the program set first. Each id: Name mints a UI_Name handle you drive from handlers: call Ui.build() then Ui.open(UI_MainMenu) at start, Ui.tick(Input.key()) each update to move focus and activate, and Ui.clicked(UI_Name) to react. Draw it during Render with Ui.render() between Screen.clear and Screen.show().
program TitleScreen {
var title_font: int = 0
ui MainMenu {
panel id: Root w: 288 pad: 16 gap: 6 bg: 0x1a1a2c align: center {
label text: "CHRONO RIFT" font: title_font size: 26 fg: 0xffe060 align: center
button id: NewGame text: "New Game" font: title_font size: 16 w: 236
button id: Quit text: "Quit" font: title_font size: 16 w: 236
}
}
handler Boot phase Start {
title_font = Font.load("/System/Library/Fonts/Supplemental/Arial.ttf")
Ui.build()
Ui.open(UI_MainMenu)
}
handler Navigate phase Update {
Ui.tick(Input.key())
if Ui.clicked(UI_Quit) { quit() }
}
handler DrawWorld phase Render {
Screen.clear(Color.MidnightBlue)
Ui.render()
Screen.show()
}
}