feat(lang): a component's event may be called set, a string prop reads a number, one name per component

- An action whose first word is `set` or `emit` followed by `(` is a call, so a component's
  `on set(v: int)` is pressed as `set(4)`; `set x = ...` is still the action.
- A `string` prop (or state, or parameter) given a number in a template reads it as text through
  ludic.ui's new `ui_val_text`; `label="{3}"` used to arrive as "".
- Two components of one name (or of names that differ only in case, which share their functions'
  names) are an error at the second declaration that names the first's file and line, instead of a
  "function cmp_x_def_y is defined twice".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Orkun ÇAKILKAYA 2026-09-24 19:53:53 +03:00
parent 584e455f2d
commit 9ad6347044
7 changed files with 42113 additions and 41882 deletions

View file

@ -34,6 +34,7 @@ function cm_prefix(name: pointer) -> pointer { return `cmp_{reg_lower(name)}_` }
function parse_ui_component() -> void {
pi += 1
let name = eat_id()
cm_unique(name)
let px = cm_prefix(name)
g_uses_value = true
let c = len(g_cm_name)

View file

@ -76,3 +76,14 @@ function cm_import_of(line: pointer) -> pointer {
while b < len(line) and line[b] != q { b += 1 }
return line[a + 1..b]
}
# a component is used by its name as a tag, so two of one name (or of names that differ only in case,
# which would share their functions' names) are an error naming both files
function cm_unique(name: pointer) -> void {
var i = 0
while i < len(g_cm_name) {
if (cm_prefix(g_cm_name[i]) == cm_prefix(name)) {
perr(`component {name} is declared twice: here and in {g_cm_file[i]}:{g_cm_line[i]} - a component is used by its name as a tag, so each needs a name of its own`)
}
i += 1
}
}

View file

@ -19,7 +19,7 @@ function cm_from(c: int, ty: pointer, x: pointer) -> pointer {
if (ty == "int") { return `value_as_int({x})` }
if (ty == "float") { return `value_as_float({x})` }
if (ty == "bool") { return `value_as_int({x}) != 0` }
if (ty == "string") { return `value_as_str({x})` }
if (ty == "string") { return `ui_val_text({x})` }
cm_err(c, `a prop or state is an int, a float, a bool, a string or a Val, not a {ty}`)
return x
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff