slovo/docs/language/examples/formatter/README.md
2026-05-22 08:38:43 +02:00

320 lines
17 KiB
Markdown

# Slovo Formatter Fixtures
Formatter fixtures define canonical layout for the current strict supported
syntax. They are not additional compiler-supported programs unless mirrored
under `examples/supported/`.
The formatter fixture set now includes the final exp-125 unsigned fixtures
absorbed into `1.0.0-beta`.
Promoted formatter fixtures may use only:
- `(module name)`
- top-level `(fn ...)`
- explicit `i32` parameters and `i32` returns, plus promoted `string`
parameters and returns
- direct `(option i32)`, `(option i64)`, and `(result i32 i32)` returns only
for first-pass option/result constructor fixtures
- integer literals
- parameter references
- binary `+`
- user-defined function calls
- legacy compiler/runtime compatibility alias `(print_i32 value)`
- local `i32` bindings with `(let name i32 value)` and `(var name i32 value)`
- immutable array locals with `(let name (array T N) array-expression)` when
`T` is `i32`, `i64`, `f64`, or `bool` and the initializer has the exact
declared fixed array type
- assignment to mutable local `i32` bindings with `(set name value)`
- value-producing `(if condition then-expression else-expression)`
- first-pass `(while condition body...)` as a non-final sequential body form
- top-level `(struct Name (field i32)...)`
- first-pass struct construction and immediate field access
- first v1 struct value flow through immutable locals, parameters, returns,
calls returning structs, and stored field access
- fixed direct scalar array constructors and literal `(index array index)`
- fixed direct scalar array value flow through immutable array locals
initialized from matching array-valued expressions, fixed array parameters,
returns, calls returning arrays, and dynamic `(index array index)` with `i32`
index expressions
- first-pass `(some i32 value)`, `(none i32)`, `(some i64 value)`,
`(none i64)`, `(ok i32 i32 value)`, and `(err i32 i32 value)` constructors
as direct function returns
- first v1 option/result value flow through immutable locals, parameters, calls
returning option/result values, and `is_some` / `is_none` / `is_ok` /
`is_err` tag observation
- first v1 option/result payload access with `unwrap_some`, `unwrap_ok`, and
`unwrap_err`
- v1.4 source-level `match` for `(option i32)`, `(option i64)`, and
`(result i32 i32)` values, with exhaustive arms, immutable arm-scoped
payload bindings, one-or-more expression arm bodies, and common arm result
types
- source string literals used directly as `print_string` or
`std.io.print_string` arguments
- legacy compiler/runtime compatibility alias `(print_string value)`
- immutable string locals with `(let name string value)`
- string parameters and string returns
- calls returning strings
- string equality with `=`
- string byte length with `(string_len value)`
- legacy compiler/runtime compatibility alias `(print_bool value)`
- compiler-known standard-runtime calls `(std.io.print_i32 value)`,
`(std.io.print_string value)`, `(std.io.print_bool value)`, and
`(std.string.len value)`
- exp-112 direct immutable `bool` locals with `(let name bool value)` over the
already promoted bool-expression surface
- exp-20 direct `f64` parameters, returns, immutable locals, decimal literals,
same-type `f64` arithmetic/comparison, and `(std.io.print_f64 value)`
- exp-21 direct `i64` parameters, returns, immutable locals, explicit signed
decimal `i64` literal atoms, same-type `i64` arithmetic/comparison, and
`(std.io.print_i64 value)`
- exp-22 explicit numeric widening calls
`std.num.i32_to_i64 : (i32) -> i64`,
`std.num.i32_to_f64 : (i32) -> f64`, and
`std.num.i64_to_f64 : (i64) -> f64`
- exp-23 checked numeric narrowing call
`std.num.i64_to_i32_result : (i64) -> (result i32 i32)`
- exp-24 integer to string calls
`std.num.i32_to_string : (i32) -> string` and
`std.num.i64_to_string : (i64) -> string`
- exp-25 string parse i64 result call
`std.string.parse_i64_result : (string) -> (result i64 i32)`
- exp-26 f64 to string call `std.num.f64_to_string : (f64) -> string`
- exp-27 checked f64 to i32 result call
`std.num.f64_to_i32_result : (f64) -> (result i32 i32)`
- exp-28 string parse f64 result call
`std.string.parse_f64_result : (string) -> (result f64 i32)`
- exp-29 direct immutable `i64` and finite `f64` struct fields, using
existing struct construction, immutable struct flow, field access,
same-type numeric arithmetic/comparison, and numeric print/format helpers
- exp-30 conservative source-layout helper shape in
`std-source-layout-alpha.slo`, without repo-root `std` import/search
support or source replacement of compiler-known `std.*` calls
- exp-31 checked f64 to i64 result call
`std.num.f64_to_i64_result : (f64) -> (result i64 i32)`
- exp-1 compiler-known call `(std.string.concat left right)`
- exp-2 `(vec i32)` type forms and compiler-known calls
`(std.vec.i32.empty)`, `(std.vec.i32.append values value)`,
`(std.vec.i32.len values)`, and `(std.vec.i32.index values index)`
- exp-3 compiler-known calls `(std.io.eprint value)`,
`(std.process.argc)`, `(std.process.arg index)`, `(std.env.get name)`,
`(std.fs.read_text path)`, and `(std.fs.write_text path text)`
- exp-4 payloadless enum declarations `(enum Name VariantA VariantB)`,
zero-argument qualified constructors `(Name.VariantA)`, enum locals,
parameters, returns, calls, equality, and exhaustive enum `match`
- exp-16 unary `i32` enum payload variants such as `(Value i32)`,
qualified unary constructors such as `(Reading.Value value)`, immutable
arm-local payload bindings in enum `match`, and same-enum tag-plus-payload
equality
- exp-18 direct enum struct fields and exp-19 direct `bool` and immutable
`string` struct fields, using existing struct construction, immutable
struct flow, field access, equality, enum `match`, bool predicate, and
`std.string.len` forms
- exp-8 compiler-known calls `(std.time.monotonic_ms)` and
`(std.time.sleep_ms 0)` for structural/non-negative conformance checks only
- exp-11 compiler-known call `(std.random.i32)` and non-negative
structural checks using existing `<` and `if` forms
- exp-12 compiler-known call `(std.io.read_stdin_result)` using
existing `(result string i32)` observers, unwrap, and `match`
- exp-13 compiler-known call `(std.string.parse_i32_result text)` using
existing `(result i32 i32)` observers, unwrap, and `match`
- exp-15 compiler-known result helper calls `(std.result.is_ok value)`,
`(std.result.is_err value)`, `(std.result.unwrap_ok value)`, and
`(std.result.unwrap_err value)` for only `(result i32 i32)`,
`(result i64 i32)`, and `(result string i32)`
- lexical `(unsafe body... final-expression)` expression blocks containing only
otherwise supported safe v0 forms
- final-expression returns
- top-level `(test "name" body... final-expression)`
- equality comparison `=` when used as a bool-producing test expression
- ordering comparison `<` when used as a bool-producing condition
- line comments
Promoted formatter fixtures are canonical output.
Formatting one of these fixtures must reproduce the same source bytes,
including accepted full-line comments and final newline, and formatting
formatter output must be idempotent. The v1 formatter is not a width-based
pretty printer and does not promise column reflow for long inline calls or
forms.
Line comments are stable only as full-line comments before top-level forms,
inside function/test bodies before body expressions, after the final
function/test body expression before the closing paren, and after the last
top-level form. Comments inside module forms, struct forms, function/test
headers, type forms, or inline expression forms are unsupported formatter
positions and must produce structured diagnostics instead of being silently
dropped.
Nested `if`, `while`, `unsafe`, and `match` forms keep their canonical
multiline shapes. Calls, field access, arrays, struct constructors,
option/result constructors, option/result observers, option/result unwraps,
legacy print aliases, `std.io.print_*` calls, exp-1 `std.string.concat` calls,
exp-2 `std.vec.i32.*` calls, exp-3 host calls, exp-4 qualified enum
constructors, exp-16 unary enum payload constructors, exp-8 `std.time.*`
calls, and exp-13
`std.string.parse_i32_result` calls, and exp-15 `std.result.*` helper calls
and exp-20 `std.io.print_f64` calls remain inline when used as expressions.
exp-21 `std.io.print_i64`, exp-22 `std.num.*` conversion calls, exp-23
`std.num.i64_to_i32_result`, exp-24 integer-to-string calls, and exp-25
`std.string.parse_i64_result` calls, and exp-26 `std.num.f64_to_string` calls
and exp-27 `std.num.f64_to_i32_result` calls remain inline when used as
expressions. exp-28 `std.string.parse_f64_result` calls and exp-31
`std.num.f64_to_i64_result` calls remain inline when used as expressions.
`string_len` and `std.string.len` remain inline when used as expressions.
Current Slovo-side target formatter fixtures:
- `u32-numeric-primitive.slo`
- `u64-numeric-primitive.slo`
- `unsigned-integer-to-string.slo`
- `string-parse-u32-result.slo`
- `string-parse-u64-result.slo`
These formatter fixtures describe the final exp-125 unsigned contract shape
now absorbed into `1.0.0-beta`. Execution claims still come from the paired
supported/project fixtures and Glagol gates, not from formatter fixtures
alone.
Design-target forms such as mutable string locals, string assignment, string
ordering, strings inside arrays, options, or results, string containers beyond
exp-19 direct struct fields, string slices, concatenation beyond exp-1
`std.string.concat`, indexing, ownership
annotations, user-defined string runtime bindings,
`print_unit`, `std.io.print_unit`, host IO beyond the exp-3 slice and exp-12
stdin-result slice, networking, async IO, binary file APIs, directory
traversal, terminal control, platform abstraction, general host error ADTs
beyond exp-10,
`result string Error`, package interaction, stdin APIs beyond the exp-12
result slice, parsing beyond exp-13 `std.string.parse_i32_result`, exp-25
`std.string.parse_i64_result`, and exp-28
`std.string.parse_f64_result`,
result helper payload families beyond the explicitly listed `(result i32 i32)`,
`(result i64 i32)`, `(result string i32)`, and exp-28 returned
`(result f64 i32)` families,
tokenizer/scanner APIs, parsing bools/strings/bytes, numeric casts or
conversions beyond exp-22 explicit widening calls and the exp-23 checked
`i64 -> i32` result call, exp-27 checked `f64 -> i32` result call, and exp-31
checked `f64 -> i64` result call, f64
formatting beyond exp-26 finite decimal text,
locale/base/radix/grouping/padding formatting controls, generic format/display
traits, stable integer-formatting ABI/layout/ownership, implicit promotion,
mixed numeric arithmetic, `f32`,
unsigned integers, narrower integer widths beyond the existing `i32`,
char/bytes/decimal,
whitespace/locale/base-prefix/underscore/plus-sign parsing beyond the exact
exp-13, exp-25, and exp-28 parse calls, Unicode digit parsing, parse error
messages or richer codes, randomness beyond the exp-11
slice, time beyond the exp-8 host time/sleep slice, generic vectors,
vector element types other than `i32`,
vector mutation, vector `var` or `set`, vector literals beyond empty/append
construction, `push`, nested vectors, vectors in arrays, structs, options, or
results, iterators, slices, maps, sets, user-visible vector deallocation,
stable vector ABI/layout/helper symbols, allocation, user-defined standard
modules, imports/packages, overloading, generic APIs, Unicode length
semantics, general slices, pointer types, raw memory operations, array
mutation, array element types beyond direct scalar `i32`, `i64`, `f64`,
`bool`, and `string`, zero-length arrays, nested arrays, array equality,
printing arrays, option/result mapping, equality, printing,
non-`i32` payload extraction, nested option/result values, arrays or structs
containing option/results, generic payloads, enum payloads beyond exp-16 unary
`i32` variants, generic enums, generic functions, type aliases,
traits/interfaces/protocols, methods, derives, wildcard/rest enum patterns,
enum guards, nested enum patterns, enum values in
arrays/structs/options/results/vectors, enum mutation,
enum printing/ordering/hash, enum reflection, explicit enum discriminants,
enum constructors with multiple arguments, unqualified variant constructors,
stable enum ABI/layout, moving option/result to ordinary standard-library
types, user-catchable exceptions, struct mutation, unsafe abstractions, and
user-declared `unit` returns must stay out of this directory until they meet
the strict support rule.
`canonical.slo` is the canonical formatted shape for the current supported
function fixture surface. `top-level-test.slo` is the canonical formatted shape
for the promoted top-level test fixture surface. `local-variables.slo` is the
canonical formatted shape for promoted local `let` / `var` / `set` forms,
including the later exp-112 immutable bool-local broadening.
`if.slo` is the canonical formatted shape for promoted value-producing
conditionals. `while.slo` is the canonical formatted shape for promoted
first-pass loops. `struct.slo` is the canonical formatted shape for promoted
first-pass structs. `struct-value-flow.slo` is the canonical formatted shape
for the first v1 struct value-flow slice. `array.slo` is the canonical
formatted shape for promoted first-pass array constructors, immutable array
locals, and literal indexing. `array-direct-scalars.slo` is the canonical
formatted shape for the widened direct scalar fixed-array constructor and
literal-indexing slice. `array-value-flow.slo` is the canonical formatted
shape for the first v1 array value-flow and dynamic-indexing slice.
`array-direct-scalars-value-flow.slo` is the canonical formatted shape for the
widened direct scalar fixed-array value-flow and dynamic-indexing slice.
`array-string.slo` is the canonical formatted shape for the widened fixed
string-array constructor and literal-indexing slice.
`array-string-value-flow.slo` is the canonical formatted shape for the widened
fixed string-array value-flow and dynamic-indexing slice.
`option-result.slo` is the canonical formatted shape for promoted first-pass
option/result constructors.
`option-result-flow.slo` is the canonical formatted shape for the first v1
option/result value-flow slice. `option-result-payload.slo` is the canonical
formatted shape for the first v1 option/result payload-access slice.
`option-result-match.slo` is the canonical formatted shape for the v1.4
option/result match slice.
`string-print.slo` is the canonical formatted shape for the first runtime
string-printing slice.
`string-value-flow.slo` is the canonical formatted shape for the v1.2
immutable string value-flow, equality, and length slice.
`print-bool.slo` is the canonical formatted shape for the v1.2 bool-printing
slice.
`standard-runtime.slo` is the canonical formatted shape for the v1.5
standard-runtime alpha names.
`owned-string-concat.slo` is the canonical formatted shape for the exp-1
owned-runtime-string concat fixture.
`vec-i32.slo` is the canonical formatted shape for the exp-2 `(vec i32)`
fixture.
`vec-i64.slo` is the canonical formatted shape for the exp-94 `(vec i64)`
fixture.
`host-io.slo` is the canonical formatted shape for the exp-3 standard IO and
host environment fixture.
`time-sleep.slo` is the canonical formatted shape for the exp-8 host time and
sleep fixture aligned by the exp-14 release.
`random.slo` is the canonical formatted shape for the exp-11 basic randomness
alpha release fixture.
`stdin-result.slo` is the canonical formatted shape for the exp-12 standard
input result alpha release fixture.
`string-parse-i32-result.slo` is the canonical formatted shape for the exp-13
string parse i32 result alpha fixture.
`result-helpers.slo` is the canonical formatted shape for the exp-15 result
helper standard names alpha fixture.
`enum-basic.slo` is the canonical formatted shape for the exp-4 payloadless
user enum fixture.
`enum-payload-i32.slo` is the canonical formatted shape for the exp-16 unary
`i32` enum payload fixture.
`primitive-struct-fields.slo` is the canonical formatted shape for the exp-19
primitive struct field fixture.
`local-variables.slo` is the canonical formatted shape for the exp-112
immutable bool locals fixture.
`f64-numeric-primitive.slo` is the canonical formatted shape for the exp-20
f64 numeric primitive fixture.
`i64-numeric-primitive.slo` is the canonical formatted shape for the exp-21
i64 numeric primitive fixture.
`numeric-widening-conversions.slo` is the canonical formatted shape for the
exp-22 numeric widening conversions fixture.
`checked-i64-to-i32-conversion.slo` is the canonical formatted shape for the
exp-23 checked i64-to-i32 conversion fixture.
`integer-to-string.slo` is the canonical formatted shape for the exp-24
integer to string fixture.
`string-parse-i64-result.slo` is the canonical formatted shape for the exp-25
string parse i64 result fixture.
`f64-to-string.slo` is the canonical formatted shape for the exp-26 f64 to
string fixture.
`f64-to-i32-result.slo` is the canonical formatted shape for the exp-27
checked f64-to-i32 result fixture.
`string-parse-f64-result.slo` is the canonical formatted shape for the exp-28
string parse f64 result fixture.
`numeric-struct-fields.slo` is the canonical formatted shape for the exp-29
numeric struct fields fixture.
`std-source-layout-alpha.slo` is the canonical formatted shape for the exp-30
standard library source layout alpha fixture.
`f64-to-i64-result.slo` is the canonical formatted shape for the exp-31
checked f64-to-i64 result fixture.
`unsafe.slo` is the canonical formatted shape for promoted lexical unsafe
blocks.
`comments.slo` is the canonical formatted shape for the promoted v1 full-line
comment stability positions.