ludic/selfhost
Orkuncakilkaya ad63f09d53 Phase 7d: string interpolation text {expr} text
The readable way to build strings, as you noted `{a} {b}` beats `a + " " + b`.
A backtick string embeds any expression in `{…}` and desugars to the Phase-7c
`+` chain, wrapping each hole in `str(...)`:

  `hello {name}, n={count + 1}`
    ==  "hello " + name + ", n=" + str(count + 1)

- Lexer: a backtick captures its content raw as TK_INTERP.
- Parser: parse_interp splits literal runs from `{…}` holes (brace-depth aware,
  `{{`/`}}` escape to literal braces), re-lexes each hole as a full expression
  (save/restore toks/pi like an import), and folds it all into E_BIN(+) nodes —
  so no new AST or runtime beyond the existing concat.
- str(x): a string passes through; int/bool/fixed convert via a small emitted
  @fn_int_str prelude (digits from the end of a buffer, '-' for negatives),
  emitted once into any program that uses it.

examples/strings.ludic gains interpolation cases (now prints 1..7); the smoke
covers it. Grammar + ludic_syntax.h tokenize backtick strings (holes highlighted
as embedded code). LANGUAGE.md documents it as the preferred form.

Reseeded (22530 lines); C-free fixpoint holds; goldens identical; 18/18; vocab +
doc-fences clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-28 01:12:07 +03:00
..
golden Baseline: Ludic compiler + toolchain, Phase 1 syntax fixes complete 2026-08-27 15:15:35 +03:00
tests Phase 7a: bitwise operators & | ^ << >> ~ (retire band/bor/shl/…) 2026-08-28 00:45:10 +03:00
ast.ludic Phase 7b: null literal + x == null (retire ptr_null/ptr_is_null) 2026-08-28 00:50:21 +03:00
bootstrap-cfree.sh Phase 6a: rename core vocabulary (game/main/component/archetype/system) 2026-08-27 18:22:13 +03:00
bootstrap.sh Baseline: Ludic compiler + toolchain, Phase 1 syntax fixes complete 2026-08-27 15:15:35 +03:00
buf.ludic Phase 7b: null literal + x == null (retire ptr_null/ptr_is_null) 2026-08-28 00:50:21 +03:00
build.sh Phase 6a: rename core vocabulary (game/main/component/archetype/system) 2026-08-27 18:22:13 +03:00
compile.sh Baseline: Ludic compiler + toolchain, Phase 1 syntax fixes complete 2026-08-27 15:15:35 +03:00
emit_addr.ludic Phase 7c: string operators + and ==/!= (retire streq/sconcat) 2026-08-28 01:05:36 +03:00
emit_core.ludic Phase 7d: string interpolation text {expr} text 2026-08-28 01:12:07 +03:00
emit_decl.ludic Phase 7d: string interpolation text {expr} text 2026-08-28 01:12:07 +03:00
emit_ecs.ludic Phase 7c: string operators + and ==/!= (retire streq/sconcat) 2026-08-28 01:05:36 +03:00
emit_expr.ludic Phase 7d: string interpolation text {expr} text 2026-08-28 01:12:07 +03:00
emit_game.ludic Phase 7c: string operators + and ==/!= (retire streq/sconcat) 2026-08-28 01:05:36 +03:00
emit_head.ludic Phase 7d: string interpolation text {expr} text 2026-08-28 01:12:07 +03:00
emit_intrin.ludic Phase 7c: string operators + and ==/!= (retire streq/sconcat) 2026-08-28 01:05:36 +03:00
emit_intrin2.ludic Phase 7c: string operators + and ==/!= (retire streq/sconcat) 2026-08-28 01:05:36 +03:00
emit_machine.ludic Phase 7c: string operators + and ==/!= (retire streq/sconcat) 2026-08-28 01:05:36 +03:00
emit_math.ludic Phase 7c: string operators + and ==/!= (retire streq/sconcat) 2026-08-28 01:05:36 +03:00
emit_new.ludic Phase 7c: string operators + and ==/!= (retire streq/sconcat) 2026-08-28 01:05:36 +03:00
emit_query.ludic Phase 7c: string operators + and ==/!= (retire streq/sconcat) 2026-08-28 01:05:36 +03:00
emit_save.ludic Phase 7c: string operators + and ==/!= (retire streq/sconcat) 2026-08-28 01:05:36 +03:00
emit_spawn.ludic Phase 7c: string operators + and ==/!= (retire streq/sconcat) 2026-08-28 01:05:36 +03:00
emit_stmt.ludic Phase 7c: string operators + and ==/!= (retire streq/sconcat) 2026-08-28 01:05:36 +03:00
emit_ui.ludic Phase 7c: string operators + and ==/!= (retire streq/sconcat) 2026-08-28 01:05:36 +03:00
game-build.sh Baseline: Ludic compiler + toolchain, Phase 1 syntax fixes complete 2026-08-27 15:15:35 +03:00
io.ludic Phase 7b: null literal + x == null (retire ptr_null/ptr_is_null) 2026-08-28 00:50:21 +03:00
lex.ludic Phase 7d: string interpolation text {expr} text 2026-08-28 01:12:07 +03:00
ludicc.seed.ll Phase 7d: string interpolation text {expr} text 2026-08-28 01:12:07 +03:00
main.ludic Phase 7c: string operators + and ==/!= (retire streq/sconcat) 2026-08-28 01:05:36 +03:00
parse.ludic Phase 7d: string interpolation text {expr} text 2026-08-28 01:12:07 +03:00
parse_game.ludic Phase 7c: string operators + and ==/!= (retire streq/sconcat) 2026-08-28 01:05:36 +03:00
reseed.sh Phase 6a: rename core vocabulary (game/main/component/archetype/system) 2026-08-27 18:22:13 +03:00
str.ludic Phase 7c: string operators + and ==/!= (retire streq/sconcat) 2026-08-28 01:05:36 +03:00
test.sh Baseline: Ludic compiler + toolchain, Phase 1 syntax fixes complete 2026-08-27 15:15:35 +03:00