Programming Language

Nocter

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

/releases/v0.35.0.md

Nocter v0.35.0 Release Notes

Nocter v0.35.0 adds immutable static data and practical Unicode-aware text operations. Generated Unicode 17.0.0 tables, ordinary standard-library source, checked ownership, native layout, and editor behavior now share one static-data path without embedding Unicode semantics in the compiler. The only implemented host and native target remains arm64-darwin.

Immutable Static Data

static defines immutable, addressable storage initialized before program execution:

static ASCII_LIMITS: [u32; 2] = [65, 90]
pub static PROTOCOL_MARKERS: [u8; 3]

Static initializers use a closed compile-time value domain. Their checked product is readonly, cannot be moved or dropped, and reaches the native image only when executable code references it. The backend receives already evaluated values and owns layout and read-only Mach-O encoding; it does not interpret source expressions.

Pinned Unicode Properties

The standard library is generated from final Unicode 17.0.0 data with recorded byte lengths and SHA-256 digests. char now provides Unicode whitespace, alphabetic, lowercase, uppercase, and decimal-digit classification while retaining the separate stable ASCII predicates.

Normal compilation and release packaging consume committed generated source and never download Unicode data. Property ranges and case mappings remain private to std/internal/unicode.

Unicode Text Views and Casing

Borrowed str.trim_start, trim_end, and trim remove Unicode whitespace and return views into the original text. Full locale-independent default lowercase and uppercase conversion handles multi-scalar mappings and contextual rules such as Greek final sigma:

let trimmed = " ΟΣ ".trim()
let lowercase = trimmed.to_lowercase()
let uppercase = "Straße".to_uppercase()

Ordinary casing uses the current allocation context. Recoverable variants accept TryAllocator, preserve its result provenance, and publish no partial String when allocation fails.

Boundary-safe String Mutation

String.pop removes and returns one complete final Unicode scalar. String.truncate accepts a UTF-8 byte boundary, retains capacity, and leaves the String unchanged when an in-range offset splits an encoding. Neither operation can publish invalid UTF-8.

The unicode-text.nct example exercises Unicode trimming, contextual and expanding casing, character properties, and suffix mutation through public standard APIs.

Tooling and Distribution

Static declarations use the ordinary semantic identity path for formatting, AST output, diagnostics, hover, completion, navigation, references, rename, and semantic highlighting. Editor features follow Unicode APIs to standard source and never inspect generated mapping contents.

Release validation also binds RELEASE.json, the shipped Apache-2.0 files, and every Cargo package to one license identity before packaging.

Compatibility and Non-goals

This release does not add normalization, grapheme or word segmentation, display width, collation, locale-aware casing, case folding, scalar-position indexing, mutable statics, thread-local storage, or runtime global initialization. Existing ASCII-specific and UTF-8 byte-offset APIs retain their meanings.

Candidate Qualification

Release-content commit 97147821a0b8ae78f525768bf705074e75fd0254 passed two independent full compiler gates, explicit public-HTTPS acquisition, two byte-identical optimized package builds, all public examples, exact native process contracts, framed LSP analysis, generated Unicode reproduction, installed-home immutability, and compiler and standard-library tamper rejection.

The retained nocter-v0.35.0-arm64-darwin.tar.gz archive is 8,484,621 bytes and has SHA-256 62b30603177fc05ed9e2e50d6051ec59eeae5fbf634c05cea9467661f3dd820e. The release uses this exact qualified archive without rebuilding it.