Antra

Standardbibliothek

Antra::Value

import Antra::Value

Low-level constructors and inspectors for tagged runtime values.

Überblick#

Fuer Low-Level-Arbeit mit Runtime-Wertformen wie Tagged Arrays, Tagged Sets und Tagged Maps.

Das Paket ist bewusst technischer als normale Fach-APIs wie Duration: Es ist fuer Faelle gedacht, in denen ein Package oder eine interne Hilfsfunktion einen Tagged Value gezielt konstruieren oder inspizieren muss.

Ein kleiner Einstieg sieht so aus:

import Antra::Value as Value

my age = Value.tagged("years", 42)
my html = Value.tagged_string("html", "<b>Ada</b>")
my pair = Value.tagged_array("Pair", [1, 2])
my seen = Value.tagged_set("Seen", %<1, 2, 3>)
my user = Value.tagged_map("User", %{name: "Ada"})

println(Value.tag(age))
println(Value.data(html))
println(Value.data(pair))
println(Value.data(seen))
println(Value.tag(user))

Die kleine API ist absichtlich nah an der Runtime-Form:

  • Value.tagged(tag, value) fuer Tagged Arrays mit genau einem Wert
  • Value.tagged_string(tag, text) fuer Tagged Strings mit String-Payload
  • Value.tagged_array(tag, items) fuer vollen Array-Payload
  • Value.tagged_set(tag, items) fuer Tagged Sets
  • Value.tagged_map(tag, map) fuer Tagged Maps
  • Value.tag(value) zum Auslesen des Tags
  • Value.data(value) zum Auslesen des rohen Payloads
  • Value.untag(value) zum Entfernen genau einer Tagged-Huelle
  • Value.with_tag(tag, value) zum Wiederverpacken eines passenden Payloads als Tagged Value

Bei Tagged Sets liefert Value.data(...) dabei bewusst wieder ein normales Set zurueck, nicht die interne Hash-Storageform.

Value.untag(...) arbeitet semantisch etwas grober als Value.data(...):

  • Value.untag(%Ok[42]) liefert 42
  • Value.untag(html"<b>ok</b>") liefert den nackten String
  • Value.untag(%Seen<1, 2, 3>) liefert ein normales Set

Value.with_tag(...) waehlt die Runtime-Form passend zum Payload:

  • Array -> Tagged Array
  • Set -> Tagged Set
  • Map -> Tagged Map
  • String -> Tagged Array mit String-Payload
  • sonstige Skalare -> Tagged Array mit Einzelelement

Tagged Strings haben dabei keinen eigenen separaten Runtime-Typ: ein Literal wie html"<b>Ada</b>" und Value.tagged_string("html", "<b>Ada</b>") landen beide auf derselben Tagged-Array-Form mit genau einem String-Wert.

Fuer normalen Fachcode ist Pattern Matching meist die lesbarere Form. Value ist vor allem dann sinnvoll, wenn ein Package Tagged Values bewusst baut, entpackt oder als Datenform weiterreicht. Die kleine Laufzeitstufe ist in spec_tagged_value_api.md beschrieben.

Funktionen#

fn data(value)

Returns the raw payload of a tagged array, tagged set or tagged map.

fn tag(value)

Returns the tag of a tagged array, tagged set or tagged map, otherwise undef.

fn tagged(tag, value)

Builds a single-value tagged array at runtime.

fn tagged_array(tag, items)

Builds a tagged array from a full array payload.

fn tagged_map(tag, data)

Builds a tagged map from a plain map payload.

fn tagged_set(tag, items)

Builds a tagged set from a full set payload.

fn tagged_string(tag, text)

Builds a tagged string value with a string payload.

fn untag(value)

Removes one tagged wrapper and returns the semantic payload.

fn with_tag(tag, value)

Applies a tag to a payload using the matching tagged runtime form.

Quelle dieser Seite