Nocter v0.28.0 Release Notes
Nocter v0.28.0 completes the text-production boundary needed by ordinary command-line
applications. It adds borrowed ASCII trimming, bounded owned transformations, one recoverable
formatting contract, line-oriented writers, and symmetric stdout and stderr conveniences. The only
implemented host and native target remains arm64-darwin.
Borrowed and Owned Text Operations
Borrowed str values now expose allocation-free ASCII edge trimming:
let input: &str = " alpha beta\r\n"
let trimmed = input.trim_ascii()
trim_ascii_start, trim_ascii_end, and trim_ascii return views into the input. They recognize
ASCII space plus tab, LF, vertical tab, form feed, and CR. They do not remove non-ASCII whitespace
or allocate an owned value.
Two materializing transformations produce independently owned String values:
let rule = "=".repeat(10)
let slug = trimmed.replace_all(" ", "-")?
repeat checks the complete required capacity before construction. replace_all scans from left
to right without overlapping matches or recursively searching replacement text. An empty pattern
returns std.str.empty_pattern.
One Formatting Contract
std/fmt.Format now requires one recoverable operation and derives interpolation's aborting policy
as its standard default:
pub interface Format {
pub method &self.try_format_into(output: &+String): void!
pub default method &self.format_into(output: &+String): void
}
Project types implement try_format_into once. Built-in integers, bool, str, and String use
the same contract. Interpolation and type-owned integer conversion share one private scalar
renderer, while recoverable callers can provide their own destination allocator.
The former public fmt.try_append_* and fmt.append_* function matrices are removed rather than
retained as compatibility aliases. Existing custom Format implementations must replace their
format_into body with try_format_into and propagate destination growth failure.
Symmetric Text Output
Every Writer derives a line adapter from its exact text operation:
output.write_line("complete record")?
write_line writes the supplied UTF-8 text and exactly one LF. It does not allocate a combined
buffer, select a platform newline, or promise atomicity across the two writes.
The process stream surface is now symmetric:
io.print("partial")?
io.println(" line")?
io.eprint("warning: ")?
io.eprintln("details")?
stdout, stderr, print, println, eprint, and eprintln publish noalloc. They share the
same complete descriptor-write policy as File.write, including interruption retry, partial-write
progress, zero-progress rejection, and stable I/O failures. Output accepts text; formatting remains
explicit through interpolation.
Practical Integration
The new text-banner package example composes command-line arguments, borrowed trimming, owned
replacement and repetition, interpolation, integer formatting, stdout reporting, and stderr usage
failure. Formatter and semantic editor tests consume its ordinary package source. Hover,
completion, and navigation resolve through the same public standard-library declarations used by
native compilation.
Compatibility and Non-goals
v0.28.0 changes the public Format implementation requirement and removes the old closed append
function matrix. The text and output additions otherwise extend existing type-owned and
module-qualified APIs without adding language syntax, compiler primitives, MIR operations, ABI
rules, or runtime dependencies.
This release does not add Unicode property tables, locale-sensitive case conversion, formatting
specifiers, terminal styling, standard input, subprocess execution, networking, async I/O, another
target, or persistent compiler caches.
Candidate Qualification
Release-content commit c246a9d1e9fe4a6792b7282a553d02d195fe2e0e passed two independent
locked workspace runs with 1,521 tests passed, zero failed, and one ignored in each run. The
ignored public-HTTPS acquisition test passed separately. Warnings-denied all-target Clippy,
no-default-features checking, deterministic documentation, formatter checks, and repository
validation also passed.
Two independent optimized builds produced the same archive and installed home. The retained local
archive is 8,270,498 bytes and has SHA-256
c743ae29a9f3a83202dd8b6733d281c29e711e996e08abd3e9fb591f2efa1b63. Its isolated installed home
passed version and integrity checks, every public example, package run/build/test/graph operations,
the exact text-banner output contract, framed LSP requests, immutability checking, and compiler
and standard-library tamper rejection. Publication reuses that retained candidate without
rebuilding it.