refactor(lang): rename the str type (and stringify builtin) to string
Expand the abbreviated string type and its conversion builtin to the full
word everywhere:
str -> string (the immutable-string type)
str(x) -> str -> string(x) -> string (the stringify builtin;
what `{…}` interpolation calls)
Types are recognized by identifier, and llty maps both spellings to LLVM
`ptr`, so this is an atomic source rewrite: type annotations, the Ludic
type tags, the builtin name/dispatch, and the interpolation desugar, plus
the grammars, LSP, docs (type-str -> type-string, fn-str -> fn-string), and
inventory. int/bool stay (universally accepted, like Math).
Reseeded; C-free fixpoint holds; all suites green (45/24/29); site + check.py OK.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
4c48077d68
commit
b7745a4600
70 changed files with 207 additions and 207 deletions
|
|
@ -13,5 +13,5 @@ The access operators reach into a compound value. `value.field` reads or writes
|
|||
```ludic
|
||||
let head_column: int = segments[0].column
|
||||
segments[0].column = head_column + 1
|
||||
let extension: str = file_name[len(file_name) - 4 .. len(file_name)]
|
||||
let extension: string = file_name[len(file_name) - 4 .. len(file_name)]
|
||||
```
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ tip: Compare two values and yield a bool; on strings == compares contents.
|
|||
order: 1
|
||||
---
|
||||
|
||||
The comparison operators — `==` (equal), `!=` (not equal), `<`, `<=`, `>`, `>=` — take two values and yield a `bool`, the kind of test an `if` or `where` clause wants. On `str` values `==` and `!=` compare <b>by content</b>, so `direction == "left"` checks the characters, not the pointer (a comparison against `null` stays a pointer test). Comparison binds looser than arithmetic and looser than the bitwise operators, so `flags & MASK == 0` reads as `(flags & MASK) == 0` with no parentheses needed. Chain several conditions together with `and` / `or`.
|
||||
The comparison operators — `==` (equal), `!=` (not equal), `<`, `<=`, `>`, `>=` — take two values and yield a `bool`, the kind of test an `if` or `where` clause wants. On `string` values `==` and `!=` compare <b>by content</b>, so `direction == "left"` checks the characters, not the pointer (a comparison against `null` stays a pointer test). Comparison binds looser than arithmetic and looser than the bitwise operators, so `flags & MASK == 0` reads as `(flags & MASK) == 0` with no parentheses needed. Chain several conditions together with `and` / `or`.
|
||||
|
||||
```ludic
|
||||
if current_health <= 0 { become GameOver }
|
||||
|
|
|
|||
|
|
@ -8,10 +8,10 @@ tip: A backtick string with {expr} holes, each stringified and concatenated.
|
|||
order: 7
|
||||
---
|
||||
|
||||
A backtick string `` `…` `` is an interpolated string: any `{expr}` hole inside it is evaluated, converted to text, and concatenated with the surrounding literal parts. Numbers, `bool`s, and `fixed` values are stringified automatically and `str` values pass through, so `` `score: {score}` `` desugars to `"score: " + str(score)`. It is the readable way to build a message from mixed pieces without hand-writing a `+` chain. Write a literal brace with `{{` or `}}`.
|
||||
A backtick string `` `…` `` is an interpolated string: any `{expr}` hole inside it is evaluated, converted to text, and concatenated with the surrounding literal parts. Numbers, `bool`s, and `fixed` values are stringified automatically and `string` values pass through, so `` `score: {score}` `` desugars to `"score: " + string(score)`. It is the readable way to build a message from mixed pieces without hand-writing a `+` chain. Write a literal brace with `{{` or `}}`.
|
||||
|
||||
```ludic
|
||||
let status_line: str = `score {score} — health {current_health}/{maximum_health}`
|
||||
let status_line: string = `score {score} — health {current_health}/{maximum_health}`
|
||||
Screen.status(status_line)
|
||||
print(`wave {wave_number} incoming`)
|
||||
```
|
||||
|
|
|
|||
|
|
@ -8,11 +8,11 @@ tip: Integer, hex, character, string, boolean, and null-pointer literals.
|
|||
order: 8
|
||||
---
|
||||
|
||||
Literals are the fixed values you write directly in source. `42` is a decimal `int` and `0x1E90FF` is a hex `int` — hex is how colors are written, so a raw color is just an integer. A number with a decimal point (`1.5`) is a `fixed`. `'w'` is a character literal, an `int` code point handy for comparing against `Input.key()`. `"text"` is a `str`, `true` / `false` are `bool`s, and `null` is the null-pointer literal used to test an unset record, slice, or `ptr` field.
|
||||
Literals are the fixed values you write directly in source. `42` is a decimal `int` and `0x1E90FF` is a hex `int` — hex is how colors are written, so a raw color is just an integer. A number with a decimal point (`1.5`) is a `fixed`. `'w'` is a character literal, an `int` code point handy for comparing against `Input.key()`. `"text"` is a `string`, `true` / `false` are `bool`s, and `null` is the null-pointer literal used to test an unset record, slice, or `ptr` field.
|
||||
|
||||
```ludic
|
||||
let sky_color: int = 0x1E90FF
|
||||
let banner: str = "GAME OVER"
|
||||
let banner: string = "GAME OVER"
|
||||
if Input.key() == 'w' { row = row - 1 }
|
||||
if next_segment == null { is_tail = true }
|
||||
```
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue