Programming Language

Nocter

A self-contained systems language built around simplicity, encapsulation, and foolproof design.

/releases/v0.9.0.md

Nocter v0.9.0 Release Notes

Download nocter-v0.9.0-arm64-darwin.tar.gz

Nocter v0.9.0 makes borrowed text and collection behavior source-owned, adds practical whole-stream I/O and borrowed text operations, and removes inferred result-origin noise from ordinary APIs.

Practical Stream I/O

Every Reader now shares source-defined read_to_end and read_to_string methods. They preserve partial reads, reject impossible byte counts, propagate the first read failure, and validate UTF-8 only after the complete stream has been collected. Writer.write_text shares the corresponding UTF-8 byte adapter. File, buffered I/O, and user-defined implementations use the same interface defaults without concrete forwarding methods.

Result-Origin Elision

An unambiguous result origin no longer needs a written from clause. The compiler derives zero or one caller-managed origin from the resolved declaration and validates function bodies against that contract. A declaration whose storage-bearing result could retain more than one external input still names the choice explicitly:

func view(text: &String): &str
func choose(left: &str, right: &str, first: bool): &str from left | right

The formatter and language server preserve authored notation. They do not insert inferred clauses into hover, completion, or signature help.

Borrowed Text Operations

Borrowed str values support validated range projection, prefix and suffix removal, lazy splitting, and line iteration. split_views yields borrowed components without allocation and retains both the source text and separator. lines handles LF and CRLF terminators without synthesizing a trailing empty line. Source provenance remains attached through optional results, iterators, adapters, and receiver coercion.

Source-Owned View Methods

str and [T] now own their observation methods in std/str and std/slice. String and Vec<T> reach those methods through their declared one-step borrow coercions:

let text = String "Nocter"
let text_length = text.len()

let values = Vec [1, 2, 3]
let first = values.get(0)

The old public String and Vec<T> forwarding helpers for view, view_mut, len, is_empty, iteration, and element projection are removed. Explicit borrowed views use as, such as (&text) as &str or (&values) as &[i32].

The compiler recognizes only four private representation primitives by resolved identity. Method typing, ownership, lowering, hover, completion, signature help, definition, references, rename, and semantic tokens use the selected source declaration rather than a public member name or a synthetic owning-type method.

Compatibility and Limits

Code importing a removed owning-view forwarding function must use a method, expected-type coercion, or explicit as expression. Construction, mutation, capacity management, ownership transfer, and stable std/string text-operation imports remain available.

This release does not add Unicode scalar or grapheme APIs, lifetime parameters, transitive or owned coercions, async I/O, recoverable collection allocation, dynamic dispatch, another target, or a stable cross-version ABI. The supported host and target remain arm64-darwin.

Qualification

The v0.9.0 candidate passed clean and incremental complete repository verification, with 3,391 tests per run plus formatting, documentation generation, and warnings-denied Clippy. The local arm64-darwin archive is 3,375,819 bytes with SHA-256 c11f7ea65f49a8061156e47af7621b46b2f86329d464a067a5efc036eecb0cf8.

Two independently created archives had equivalent extracted content. A fresh extraction without environment configuration passed package creation, locked/offline check and native test, deterministic graph generation, run, explicit build, direct Mach-O execution, and the complete LSP initialize, initialized, shutdown, and exit lifecycle.