🎨 Стилі виводу
Іменовані набори властивостей для /display. Колір, розмір, стиль шрифту — оголошуються один раз і використовуються скрізь.
Стиль — це іменований набір властивостей виводу. Він оголошується до ::start:: і зберігається в таблиці стилів компілятора. При використанні — компілятор читає слот стилю і генерує відповідні ANSI escape коди в IR.
/text(#RRGGBB або R, G, B)
/background(#RRGGBB або R, G, B)
/size(N)
/normal або /border, /italic, /underlined
/style("Impact")
end ІМ'Я_СТИЛЮ
/display::ANNA_MARIYA /text(#F19CBB) /background(127, 255, 212) /size(7) /italic /style("Impact") end ANNA_MARIYA
/display::ERROR_STYLE /text(255, 60, 60) end ERROR_STYLE
/text(241, 156, 187)
/background(0, 0, 0)
/size(7)
/style("Mono")
Флаги стилю тексту — взаємовиключні з /normal:
/display::BOLD_STYLE /text(255, 255, 255) /border, /italic, /underlined end BOLD_STYLE
Кожен стиль займає 16 байт у глобальній таблиці @styles_table. Вирівнювання 16 байт — для ефективного читання будь-яким процесором.
| Байти | Поле | Діапазон | Примітка |
|---|---|---|---|
| 0–2 | text RGB | 0..255 кожен | колір тексту |
| 3–5 | bg RGB | 0..255 кожен | колір фону |
| 6 | size | 0..255 | 0 = не задано |
| 7 | flags | 0x00..0x07 | bit0=border, bit1=italic, bit2=underlined |
| 8–9 | font index | uint16 | заглушка в v0.1 |
| 10–15 | резерв | — | для майбутніх властивостей |
@styles_table = private global [N x [16 x i8]] [...], align 16 — де N кількість стилів у програмі.
/display::PINK_STYLE /text(#F19CBB) /background(127, 255, 212) end PINK_STYLE app (/intbyte, /var) val = 42 ::start:: /display(val(PINK_STYLE))
Якщо повний стиль не потрібен — використовуйте &text і &background безпосередньо після /display.
/display(val)&text(#FF0000)
/display(val) &background(0, 128, 255)
& — допустимий.
/display(val)&text(#FFFFFF) &background(0, 0, 0)
&text — inline завжди перемагає.
/replace створює тимчасову копію стилю, змінює в ній вказані властивості, виконує /display з цією копією, після чого копія видаляється. Оригінальний стиль залишається незмінним.
/display::ANNA_MARIYA /text(#F19CBB) /background(127, 255, 212) end ANNA_MARIYA app (/intbyte, /var) val = 42 ::start:: ! ANNA_MARIYA: text=#F19CBB, bg=(127,255,212) /display(val(ANNA_MARIYA))/replace(&background(0, 0, 0)) ! Для цього рядку: text=#F19CBB, bg=(0,0,0) ! ANNA_MARIYA далі — незмінний: bg=(127,255,212)
llvm.lifetime.start), копіює слот стилю, застосовує override, виконує display, звільняє (llvm.lifetime.end). Явне звільнення — не сподіватись на оптимізатор.
/replace зараз підтримується тільки для /display. Для /shelf та інших типів — буде реалізовано окремо.
/display(val(UNKNOWN_STYLE)) ! E104: Стиль 'UNKNOWN_STYLE' не оголошений
/display::MY_STYLE /text(#FF0000) end MY_STYLE /display::MY_STYLE ! E104: Стиль 'MY_STYLE' вже оголошений /text(#00FF00) end MY_STYLE
/display::STYLE_A /text(#FF0000) end STYLE_B ! E104: 'end STYLE_B' не відповідає '/display::STYLE_A'
/background(276, 132, 476) ! E104: Значення RGB '276' перевищує максимум 255 (компонента R)
/background(23, 67) ! E104: RGB потребує рівно 3 компоненти: (R, G, B)
/background(-132, 0, 0) ! E104: Значення RGB не може бути від'ємним (компонента R = -132)
/size(256) ! E104: Розмір шрифту '256' перевищує максимум 255
/size(-12) ! E104: Розмір шрифту не може бути від'ємним (-12)
/display::BAD /normal /italic ! E104: '/normal' несумісний з '/italic' end BAD