Programming Language

Nocter

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

/releases/v0.18.0.md

Nocter v0.18.0 Release Notes

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

Nocter v0.18.0 makes type construction, builtin declarations, generic requirements, and interface implementation more direct. It also replaces rollback-oriented compiler mutation with immutable semantic generations, improving editor recovery without changing runtime representation or ABI.

The only implemented host and native target remains arm64-darwin.

Construction Surfaces

construct no longer has a default member. Structural Type { ... } construction is governed only by representation and field visibility. Named factories and typed literals remain explicit members:

construct String {
    pub literal ""(text: &str): Self
    pub func empty(): Self
}

An empty construct declaration is invalid. Hover on a nominal type presents that type rather than appending a synthesized list of construction members; each factory or literal has its own ordinary source-backed hover and navigation identity.

Source-Declared Builtins and Primitives

Named compiler-represented types now have ordinary declarations in the standard library:

pub primitive type str
primitive func str_len_raw(text: &str): usize

The compiler resolves each builtin declaration once from the selected toolchain package. Type checking, inherent methods, completion, hover, and navigation consume that same identity instead of recovering builtin ownership from a spelling or module path. Primitive functions use the same modifier order as ordinary functions.

Interface Implementation and Generic Requirements

instance is now the sole owner of behavior attached to an existing type. The standalone conform declaration has been removed. A bodyless impl member records interface implementation and its associated-type bindings:

instance ValuesIter<T> {
    impl Iterator { .Item = T }

    method &+self.next(): T? {
        // ...
    }
}

Generic angle brackets contain generic arguments only. Associated bindings use braces and a leading dot. Interface requirements use impl, while callable values remain ordinary callable types:

func consume<T>(value: T): void where T impl Iterator { .Item = &str }
let callback: func(i32): String

Each checked interface implementation freezes its required methods to exact inherent callables. Selection does not depend on source order, instance-fragment order, or declaration order.

Compiler and Editor Reliability

Compiler semantic state is now immutable between accepted generations. Type interning, copyability, and closure construction use explicit branch-local transactions: success commits a new authority, while failure discards the branch or retains an isolated recovery authority. Editor queries cannot mutate accepted compilation output or exchange type identities between unrelated branches.

Workspace analysis freezes one topology decision per source revision. Source projection remains an editor and diagnostic product and cannot influence checked semantics. Package-root facts, frontend bindings, CLI installation routing, and semantic query capability are each owned by one explicit contract rather than reconstructed by downstream consumers.

Compatibility

This release intentionally has no compatibility parser or fallback for the removed forms:

  • remove default from construct members;
  • replace primitive Name with primitive type Name and primitive callable declarations with primitive func;
  • move standalone conform declarations into instance as bodyless impl members;
  • replace colon-based interface constraints with impl constraints;
  • replace associated bindings in angle brackets with { .Name = Type };
  • use callable types directly instead of treating func(...) as an interface requirement.

The release does not add dynamic interface values, erased callable objects, interface inheritance, runtime generic dictionaries, another native target, or new practical standard-library APIs.

Qualified Candidate

The v0.18.0 release candidate was qualified from commit 4490dcd411215ae43b196dbde71f9b1afbec2ae7. Two independent optimized builds produced byte-identical archives and installed homes. The ARM64 Darwin archive is 7,498,219 bytes with SHA-256 534e4ea5231923877ee76cdadeb070a4c11f881dc09ecb517b037af49a17abf6.

Two clean locked workspace test runs each reported 1,350 passed, 0 failed, and 1 ignored. Clean warnings-denied Clippy, formatting, manifest, documentation, public-HTTPS dependency acquisition, fresh-install CLI, native execution, standard-library, and LSP checks also passed.