การเรนเดอร์th-TH

ค่า

Translation status: ภาษาไทย reader-locale proof. Term names and code fences follow the th-TH pack; supporting prose may still be English.

JSON-shaped dynamic value literal for open object-shaped data.

Syntax: ค่า

Category#

conversion

Examples#

radix/corpus/conversio/valor-boxing.fab (canonical · conversio)#

T ↦ ค่า boxing for scalar, byte, collection, ชนิด, and tensor carriers.

# =============================================================================
# ค่า — T ↦ ค่า boxing for scalar, byte, collection, ชนิด, and เทนเซอร์ carriers.
# =============================================================================
#
# What this teaches:
#   • Boxing into ค่า — `T ↦ ค่า` boxes any typed value (scalar, byte, collection, ชนิด, เทนเซอร์) into the canonical dynamic carrier.
#   • Byte preservation — `ไบต์ ↦ ค่า` composes as numeric byte values; it must not lossy-decode bytes as text.
#
# Common mistakes:
#   • Expecting to extract a specific type from ค่า without a matching variant — ค่า requires the correct runtime variant or `⇥` recovery.
#
# See also: ↦, ค่า, ไบต์, รายการ, ตาราง, ชนิด, เทนเซอร์
# =============================================================================

# การแปลง — typed values to ค่า boxing
#
# WHY: `T ↦ ค่า` boxes typed values into the canonical dynamic carrier.
# `ไบต์` composes as a list of numeric byte values; it must not lossy-decode
# bytes as text.
#
# A ค่า object has no defined key order (DECISIONS D2.9), so the ชนิด case
# reads its fields back instead of printing the object text.

class Punctum {
    var int x
    var int y
}

main {
    const int n ← 42
    const value scalar ← n ↦ value
    print scalar
    const bytes bytes ← |จาก ถึง|
    const value boxedBytes ← bytes ↦ value
    print boxedBytes
    const list<int> numeri ← [1, 2]
    const value boxedList ← numeri ↦ value
    print boxedList
    const map<string, int> scores ← { "alpha": 10 }
    const value boxedMap ← scores ↦ value
    print boxedMap
    const Punctum punctum ← Punctum { x = 3, y = 4 }
    const value boxedGenus ← punctum ↦ value
    const Punctum unboxed ← boxedGenus ↦ Punctum
    print unboxed.x
    print unboxed.y
    const เทนเซอร์<int, [2]> grid ← [5, 6] ↦ เทนเซอร์<int, [2]>
    const value boxedTensor ← grid ↦ value
    print boxedTensor
}

Expected output:

42
[222, 173]
[1, 2]
{"alpha": 10}
3
4
[5, 6]

radix/corpus/conversio/valor-composita.fab (canonical · conversio)#

ชนิด, รายการ, ตาราง, and tensor behind a ค่า: boxing, ค่า display, and ค่า ↦ T round trips.

# =============================================================================
# ค่า — ชนิด, รายการ, ตาราง, and เทนเซอร์ behind a ค่า
# =============================================================================
#
# What this teaches:
#   • Boxing — `T ↦ ค่า` keeps the composite itself behind the dynamic carrier; nothing is copied or converted.
#   • Display — a ค่า prints JSON-shaped whatever it holds: text unquoted, map keys quoted, a ชนิด as an object in declaration order.
#   • Extraction — `ค่า ↦ T` takes the composite back out: a ชนิด by its own type, a รายการ or ตาราง element by element.
#
# Common mistakes:
#   • Expecting `ค่า ↦ เทนเซอร์` to return a boxed เทนเซอร์ — a เทนเซอร์ behind a ค่า prints but never extracts; compose through `รายการ<T>` (see valor-tensor).
#   • Printing a map with several keys and pinning its order — ตาราง order is unspecified, so this file boxes a single key.
#
# See also: ↦, ค่า, รายการ, ตาราง, ชนิด, เทนเซอร์
# =============================================================================

# การแปลง — composites behind a ค่า
#
# WHY: `ค่า` is the dynamic carrier, so the runner keeps a composite as it is
# behind one and displays it as JSON. This pins the display and the round trip
# for each flat composite family, separately from the scalar rows
# (valor-scalaria), the byte row (valor-boxing) and the deeper rows — nested
# ชนิด, widening, recovery and tag tests (valor-composita-deep).

class Punctum {
    var int x
    var int y
}

main {
    # 1. A ชนิด: the object prints in field order and comes back with its fields.
    const Punctum punctum ← Punctum { x = 3, y = 4 }
    const value boxedGenus ← punctum ↦ value
    print boxedGenus
    const Punctum unboxed ← boxedGenus ↦ Punctum
    print unboxed.x
    print unboxed.y

    # 2. A รายการ: elements keep their type, so text is unquoted behind the ค่า and quoted again after.
    const list<int> numeri ← [1, 2]
    const value boxedNumeri ← numeri ↦ value
    print boxedNumeri
    const list<int> backNumeri ← boxedNumeri ↦ list<int>
    print backNumeri
    const list<string> verba ← ["a", "b"]
    const value boxedVerba ← verba ↦ value
    print boxedVerba
    const list<string> backVerba ← boxedVerba ↦ list<string>
    print backVerba

    # 3. A ตาราง: keys print quoted, and the map comes back key for key.
    const map<string, int> scores ← { "alpha": 10 }
    const value boxedScores ← scores ↦ value
    print boxedScores
    const map<string, int> backScores ← boxedScores ↦ map<string, int>
    print backScores.get("alpha") coalesce 0

    # 4. A เทนเซอร์: it prints flat.
    const เทนเซอร์<int, [2]> grid ← [5, 6] ↦ เทนเซอร์<int, [2]>
    const value boxedGrid ← grid ↦ value
    print boxedGrid
}

Expected output:

{"x": 3, "y": 4}
3
4
[1, 2]
[1, 2]
[a, b]
["a", "b"]
{"alpha": 10}
10
[5, 6]

radix/corpus/conversio/valor-genus.fab (canonical · conversio)#

ค่า ↦ ชนิด extraction with missing-field defaults and mandatory-field failure via ⊥ recovery.

# =============================================================================
# ค่า — ค่า ↦ ชนิด extraction with missing-field defaults and mandatory-field failure via ⊥ recovery.
# =============================================================================
#
# What this teaches:
#   • JSON-to-struct deserialization — `ค่า ↦ ชนิด` deserializes JSON objects into typed ชนิด records.
#   • Field policies — missing `สมัครใจ` fields zero-initialize; missing mandatory fields fail at runtime (recoverable via a `⊥` default); extra JSON keys are ignored.
#
# Common mistakes:
#   • Omitting a mandatory field from the JSON and expecting a default value — only `สมัครใจ` or default-valued fields are optional; missing mandatory fields fail at runtime.
#
# See also: ↦, ⊥
# =============================================================================

# การแปลง — ค่า to ชนิด extraction
#
# WHY: `ค่า ↦ ชนิด` deserializes JSON objects into typed records. Missing
# defaultable fields zero-initialize; missing mandatory fields fail at runtime
# (recoverable via a `⊥` default). Extra JSON keys are ignored.

class Persona {
    var string ชื่อ
    var int aetas optional
    var string โมดูล = "Roma"
    var instant born
}

main {
    const value payload ← { "nomen": "Marcus", "born": "1979-05-27T07:32:00Z", "extra": "ignored" } ↦ value
    const Persona good ← payload ↦ Persona
    assert good.nomen ≡ "Marcus"
    assert good.aetas ≡ null
    assert good.regio ≡ "Roma"
    const value stale ← { "nomen": "Livia" } ↦ value
    const Persona recovered ← stale ↦ Persona ⊥ good
    assert recovered.nomen ≡ "Marcus"
    const value boxed ← recovered ↦ value
    const Persona roundtrip ← boxed ↦ Persona
    assert roundtrip.nomen ≡ "Marcus"
    assert roundtrip.regio ≡ "Roma"
    print roundtrip.nomen
    print roundtrip.regio
    print roundtrip.born ↦ string
}

Expected output:

Marcus
Roma
1979-05-27T07:32:00Z

radix/corpus/conversio/valor-scalaria.fab (canonical · conversio)#

Scalar ค่า ↦ T extraction via FromValor (variant match, เศษ widen, ข้อความ|อินสแตนซ์ wire).

# =============================================================================
# ค่า — Scalar ค่า ↦ T extraction via FromValor (variant match, เศษ widen, ข้อความ|อินสแตนซ์ wire).
# =============================================================================
#
# What this teaches:
#   • Scalar extraction — `ค่า ↦ T` extracts typed values from dynamic JSON carriers using variant matching.
#   • Widening — `ค่า ↦ เศษ` widens `Numerus` variants losslessly.
#   • Wire text — `ค่า ↦ ข้อความ` accepts both `Textus` and `Instans` wire strings.
#   • Recovery — `⇥` provides a fallback on variant mismatch.
#
# Common mistakes:
#   • Assuming `ค่า ↦ ข้อความ` works for non-text ค่า variants — only Textus and Instans wire strings are accepted; other variants fail without a `⊥` default.
#
# See also: ↦, ⊥, อินสแตนซ์, ข้อความ
# =============================================================================

# การแปลง — scalar ค่า extraction
#
# WHY: `ค่า ↦ T` is the default runtime extraction for dynamic JSON carriers.
# Scalar arms match `Valor` variants; `ค่า ↦ เศษ` widens `Numerus` losslessly;
# `ค่า ↦ ข้อความ` accepts `Textus` and `Instans` wire strings. Typed datetime
# provenance stays on `ค่า ↦ อินสแตนซ์` (see การแปลง/instans.fab). `⊥`
# recovers on variant mismatch.

main {
    const value asInt ← 42
    const int count ← asInt ↦ int
    assert count ≡ 42
    const value asFloat ← 3.5
    const float ratio ← asFloat ↦ float
    assert ratio ≡ 3.5
    const value intForFloat ← 7
    const float widened ← intForFloat ↦ float
    assert widened ≡ 7.0
    const value asBool ← true
    const bool flag ← asBool ↦ bool
    assert flag ≡ true
    const value asText ← "salve"
    const string greeting ← asText ↦ string
    assert greeting ≡ "salve"
    const value asWire ← "1979-05-27T07:32:00Z"
    const string wire ← asWire ↦ string
    assert wire ≡ "1979-05-27T07:32:00Z"
    const value asAscii ← 'yes'
    const ascii token ← asAscii ↦ ascii
    assert token ≡ 'yes'
    const value bad ← "not-a-number"
    const int recovered ← bad ↦ int ⊥ 0
    assert recovered ≡ 0
    print count
    print ratio
    print widened
    print flag
    print greeting
    print wire
    print token
    print recovered
}

Expected output:

42
3.5
7.0
verum
salve
1979-05-27T07:32:00Z
yes
0

radix/corpus/conversio/valor-tensor.fab (canonical · conversio)#

Compose ค่า ↔ tensor roundtrip via รายการ bridges (no dedicated ค่า↔tensor arms).

# =============================================================================
# ค่า — Compose ค่า ↔ เทนเซอร์ roundtrip via รายการ bridges (no dedicated ค่า↔เทนเซอร์ arms).
# =============================================================================
#
# What this teaches:
#   • Indirect เทนเซอร์ แปลง — `ค่า ↔ เทนเซอร์` has no dedicated codegen arms; it materializes through `รายการ<T>` as an intermediate step.
#   • Roundtrip path — ค่า → รายการ → เทนเซอร์ → รายการ → ค่า, showing composition of existing operators.
#
# Common mistakes:
#   • Expecting `ค่า ↦ เทนเซอร์` to work directly without the รายการ bridge — there are no dedicated ค่า↔เทนเซอร์ arms; compose through `รายการ<T>` instead.
#
# See also: ↦, ค่า, รายการ, เทนเซอร์
# =============================================================================

# การแปลง — ค่า ↔ เทนเซอร์ compose roundtrip
#
# WHY: `ค่า ↔ เทนเซอร์` has no dedicated codegen arms. Extraction materializes
# `รายการ<T>` first; construction uses shipped `รายการ ↦ เทนเซอร์` (`structa`) and
# flatten via `เทนเซอร์ ↦ รายการ` (`.flatten()`), then `รายการ ↦ ค่า` boxing.

main {
    const value arr ← [1, 2, 3, 4]
    const list<int> xs ← arr ↦ list<int>
    assert xs.length() ≡ 4
    const เทนเซอร์<int, [4]> grid ← xs ↦ เทนเซอร์<int, [4]>
    const list<int> flat ← grid ↦ list<int>
    assert flat.length() ≡ 4
    const value roundtrip ← flat ↦ value
    print roundtrip
    const value obj ← { "alpha": 10, "beta": 20 } ↦ value
    const map<string, int> scores ← obj ↦ map<string, int>
    print scores.get("alpha") coalesce 0
}

Expected output:

[1, 2, 3, 4]
10

radix/corpus/destructura/literal.fab (canonical · existing-home)#

JSON-shaped dynamic value literal for open object-shaped data.

# =============================================================================
# ค่า — JSON-shaped dynamic value literal for open object-shaped data.
# =============================================================================
#
# What this teaches:
#   • JSON ค่า literals — `{ "key": value, ... }` creates dynamic ค่า objects using JSON5 syntax with trailing commas.
#   • Nested objects — JSON ค่า literals can be nested for complex data shapes.
#   • Constraint — JSON ค่า literals accept only constant values (strings, numbers, booleans, null, nested objects/arrays); use ชนิด or ตาราง for variable-backed construction.
#
# Common mistakes:
#   • Using retired bare object literals `{ key = expr }` instead of ชนิด construction `Type { field = expr }` — bare `{ }` is now a JSON ค่า literal with quoted keys and `:` separator.
#
# See also: ชนิด, ∷, ไม่รู้, ตาราง
# =============================================================================

# destructura — ค่า literal expressions (inline JSON)
#
# { "clavis": expr, ... }              -- JSON object literal (ค่า)
# { "clavis": expr, "nidum": { ... } } -- nested JSON objects
#
# Anonymous Faber object literals (`{ key = expr }`) are retired. Bare `{ }`
# now denotes a JSON ค่า literal: keys are quoted JSON strings separated by
# `:`, values are JSON scalars, arrays, or nested objects. Trailing commas are
# permitted (JSON5-style). Duplicate keys are an error (second occurrence).
#
# GRAMMAR:
#   jsonLiteral :← '{' (jsonMember (',' jsonMember)* ','?)? '}'
#   jsonMember  :← string ':' jsonValue
#
# EXPECTED OUTPUT:
#   Empty ค่า, point coords, keyed fields, nested records.
#
# BACKEND: Go emitter does not lower object `กระจาย` into maps (whitelist:
# destructura/literal.fab).

main {
    # --- Empty and simple records ---

    const json void ← {}
    print void
    const json punctum ← { "x": 10, "y": 20 }
    print punctum

    # Text keys and constant values
    const json forma ← { "clavis": 42 }
    print forma

    # NOTE: JSON ค่า literals accept only constant values (strings, numbers,
    # booleans, null, nested objects/arrays). For variable-backed field
    # construction, use ชนิด `Type { field = expr }` or ตาราง insertion.

    # --- Nested ค่า ---

    const json nidum ← { "extra": { "medium": 1 } }
    print nidum
}