Skip to content

Standard Library

The standard library lives in lib/std/ and is imported by module name. It is deliberately redesigned (not a port): value-typed sequences, a recursive-enum List, and a GC-free memory module.

prelude

ng
import prelude;

print (i64/string/bool/f64/f32 overloads), assert, and not. The prelude re-exports the io and string surfaces.

system

system(command) -> i64 executes the command through /bin/sh -c and returns only the command's exit status.

systemOutput(command) -> string executes the command the same way but returns the captured output; on failure it appends a trailing [exit N] marker carrying the nonzero exit status.

Because both bindings execute through /bin/sh -c, callers must not interpolate untrusted values (user input, file contents, environment data) into command strings. There is no shell-escaping API and no argument-vector variant in the stdlib, so the only safe way to pass untrusted data is to validate it against a strict allowlist (for example, matching an exact constant or a narrow pattern such as a fixed set of literals) before interpolating it.

io

readLine(), readFile(path), writeFile(path, contents), currentExecutablePath().

string

length, charAt, substring, trim, split, join, contains, replace, startsWith, endsWith, toUpper, toLower, regexMatch (invalid patterns are runtime/compile-time errors).

ng
let parts = split("  alpha,beta  ", ",");
assert(join(parts, "|") == " alpha|beta ");
assert(regexMatch("a1b2", "a.b."));

seq

Array helpers as free functions: len(array<T>) (generic), sum, arrayContains, reverse.

list

The recursive-enum sequence:

ng
enum List<T> {
    Cons(head: T, tail: ref<List<T>>),
    Nil,
}

Traversal: length, get, contains (all take ref<List<T>>). Immutable builders: listFrom(array<T>), pushFront, append, reverseList:

ng
let made = listFrom([1, 2, 3]);
let grown = append(ref made, 7);
let front = pushFront(ref made, 5);
let reversed = reverseList(ref made);

In-place mutating builders remain deferred to the runtime-session heap work.

memory

GC-free native handles:

ng
let mut cell = box(7);
write(ref cell, 9);
let value = read(ref cell);
assert(outstanding() == 1);

Box is a concrete handle with impl Drop release (example/heap_box.ng demonstrates the scope-driven free). Generic Box<T>/Gc/Arc are deferred.

imgui

The Dear ImGui binding (lib/std/imgui.ng, lowered to $ngrt_imgui*) — see ImGui Integration.

Umbrella

lib/std.ng re-exports the prelude surface; individual modules are the usual import path (import string;, import seq;, ...).

Next: Memory Management.

Made with ❤️ by the NG community.