Files
hakorune/docs/archive/phases/phase-12.7/ancp-specs/ANCP-Reversible-Mapping-v1.md

62 lines
2.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ANCP v1 Reversible Mapping (P0 subset)
Status: Preview (12.7C P0). Scope is the sugar subset already implemented and gated in 12.7B.
Goals
- Provide a clear, reversible mapping between Nyash sugar and canonical forms.
- Make roundtrip (original → canonical → ANCP → canonical → original) predictable for the subset.
Gating
- Runtime sugar is gated by `NYASH_SYNTAX_SUGAR_LEVEL=basic|full`.
- ANCP tools/nyfmt remain PoC/docs only at this stage.
Subset Mappings
- Pipeline `|>`
- Nyash: `lhs |> f(a,b)` → Canonical: `f(lhs, a, b)`
- Nyash: `lhs |> obj.m(a)` → Canonical: `obj.m(lhs, a)`
- Roundtrip invariant: No change of call order or arity.
- Safe Access `?.`
- Nyash: `a?.b` → Canonical (peek): `peek a { null => null, else => a.b }`
- Nyash: `a?.m(x)` → Canonical: `peek a { null => null, else => a.m(x) }`
- Roundtrip invariant: No change of receivers/args; only the null guard appears.
- Default `??`
- Nyash: `a ?? b` → Canonical (peek): `peek a { null => b, else => a }`
- Roundtrip invariant: Both branches preserved asis.
- Range `..`
- Nyash: `a .. b` → Canonical: `Range(a, b)`
- Roundtrip invariant: Closed form preserved; no inclusive/exclusive change.
- Compound Assign `+=, -=, *=, /=`
- Nyash: `x += y` → Canonical: `x = x + y``x` は変数/フィールド)
- Roundtrip invariant: Operator identity preserved; left target identical.
Examples (Before / Canonical / RoundTrip)
1) Pipeline + Default
```
Before: data |> normalize() |> transform() ?? fallback
Canonical: peek transform(normalize(data)) { null => fallback, else => transform(normalize(data)) }
RoundTrip: data |> normalize() |> transform() ?? fallback
```
2) Safe Access Chain
```
Before: user?.profile?.name
Canonical: peek user { null => null, else => peek user.profile { null => null, else => user.profile.name } }
RoundTrip: user?.profile?.name
```
3) Range + Compound Assign
```
Before: i += 1; r = 1 .. 5
Canonical: i = i + 1; r = Range(1, 5)
RoundTrip: i += 1; r = 1 .. 5
```
Notes
- Precise precedence handling is left to the parser; mappings assume already parsed trees.
- Full ANCP compact tokens will be documented in a separate spec revision.