The Umka Standard Library Reference

December 4, 2025 ยท View on GitHub

All standard library modules are embedded into the Umka interpreter binary. They are not provided as standalone files.

Basic library: std.um

Error handling

Types

type ErrPos* = struct {
    file: str
    func: str
    line: int
}

Call stack trace position from where error() has been called.

type Err* = struct {
    code: int
    msg: str
    sender: any
    trace: []ErrPos
}

Error description. A zero code means no error.

type StdErr* = enum {
    ok     = 0           // No error
    assert = 1           // Assertion failed
    buffer = 2           // Wrong buffer size
    ptr    = 3           // Pointers cannot be read or written
    nullf  = 4           // File is null
    eof    = 5           // End of file
}

Error codes set by the standard library functions in the Err structure.

Functions

fn error*(code: int = 0, msg: str = "", sender: any = null): Err

Generates an error description with a call stack trace.

fn exitif*(err: Err)

If err.code is not zero, terminates the program, prints the error message and the call stack trace stored in err.

fn assert*(cond: bool, msg: str = "")

If cond is false, terminates the program, prints the error message msg and the call stack trace.

Memory

Functions

fn tobytes*(buf: any): []uint8

Copies the bytes of buf to a byte array.

fn frombytes*(buf: any, bytes: []uint8): Err

Copies the bytes array to buf. If unsuccessful, returns StdErr.buffer or StdErr.ptr in Err.

Input/output

Types

type File* = __file

File handle.

type SeekFrom* = enum {
    begin                   // Beginning of file
    cur                     // Current position
    end                     // End of file
}

File seek origin. Used by fseek().

Functions

fn stdin* (): File
fn stdout*(): File
fn stderr*(): File

Return file handles for standard input, output, and error output devices.

fn fopen*(name: str, mode: str): (File, Err)

Opens the file specified by the name in the given mode, which may be one of the following strings:

"r", "w", "a", 
"rb", "wb", "ab", 
"r+", "w+", "a+", 
"r+b", "rb+", "w+b", "wb+", "a+b", "ab+"

The characters in mode have the following meaning:

'r'   read
'w'   write
'a'   append
'+'   update (read/write)
'b'   binary (not text)

Returns the file handle. If unsuccessful, returns null as a file handle and StdErr.nullf in Err.

fn fclose*(f: File): Err

Closes the file f. If unsuccessful, returns StdErr.nullf or StdErr.eof in Err.

fn fseek*(f: File, offset: int, origin: SeekFrom): Err

Sets the file pointer in the file f to the given offset from the origin. If unsuccessful, returns StdErr.nullf or StdErr.eof in Err.

fn ftell*(f: File): (int, Err)

Returns the file pointer position in the file f. If unsuccessful, returns StdErr.nullf or StdErr.eof in Err.

fn remove*(name: str): Err

Removes the file specified by the name. If unsuccessful, returns StdErr.eof in Err.

fn feof*(f: File): bool

Returns true if the file pointer position in the file f has reached the end of file.

fn fflush*(f: File): Err

Flushes the buffer for the file f. If unsuccessful, returns StdErr.nullf or StdErr.eof in Err.

fn fread*(f: File, buf: any): (int, Err)

Reads the buf variable from the file f. buf can be of any type that doesn't contain pointers, strings, dynamic arrays, interfaces, closures or fibers, except for ^[]int8, ^[]uint8, ^[]char. Returns the number of bytes read. If unsuccessful, returns StdErr.ptr, StdErr.nullf or StdErr.eof in Err.

fn freadall*(f: File): ([]char, Err)

Reads all the contents of the file f to a dynamic array of char and returns this array. f should be opened in the "rb" mode. If unsuccessful, returns StdErr.ptr, StdErr.nullf or StdErr.eof in Err.

fn fwrite*(f: File, buf: any): (int, Err)

Writes the buf variable to the file f. buf can be of any type that doesn't contain pointers, strings, dynamic arrays, interfaces, closures or fibers, except for ^[]int8, ^[]uint8, ^[]char. Returns the number of bytes written. If unsuccessful, returns StdErr.ptr, StdErr.nullf or StdErr.eof in Err.

fn println*(s: str): int
fn fprintln*(f: File, s: str): int

Write the string s followed by a newline character to the console or to the file f. Return the number of bytes written.

fn getchar*(): char

Returns a character read from the console.

Strings

Functions

fn ltrim*(s: str): str                  // Trim leading spaces and tabs
fn rtrim*(s: str): str                  // Trim trailing spaces and tabs
fn trim*(s: str): str                   // Trim leading and trailing spaces and tabs

Trim all leading and/or trailing spaces and tabs from string s. Return a new string.

Conversions

Functions

fn atoi*(s: str): int                   // String to integer
fn atof*(s: str): real                  // String to real
fn itoa*(x: int): str                   // Integer to string
fn ftoa*(x: real, decimals: int): str   // Real to string with `decimals` decimal places 

Math

Constants

const pi* = 3.14159265358979323846
const randMax* = /* Implementation-defined */

Functions

fn srand*(seed: int)

Initializes the pseudo-random number generator with seed.

fn rand*(): int

Returns an integer pseudo-random number between 0 and randMax inclusive.

fn frand*(): real

Returns a real pseudo-random number between 0 and 1 inclusive.

Time

Types

type DateTime* = struct {
    second, minute, hour: int
    day, month, year: int
    dayOfWeek, dayOfYear: int
    isDST: bool
}

Date/time structure.

Functions

fn time*(): int

Returns the number of seconds since 00:00, January 1, 1970 UTC.

fn clock*(): real

Returns the number of seconds since the start of the program.

fn localtime*(t: int): DateTime

Converts the time t to a date/time structure. t is treated as local time.

fn gmtime*(t: int): DateTime

Converts the time t to a date/time structure. t is treated as UTC time.

fn mktime*(d: DateTime): int

Converts the date/time structure d to time.

fn timestr*(d: DateTime): str

Returns the string representation of the date/time structure d.

Command line and environment

Functions

fn argc*(): int

Returns the number of command line parameters.

fn argv*(i: int): str

Returns the i-th command line parameter, where i should be between 0 and argc() - 1 inclusive.

fn getenv*(name: str): str

Returns the environment variable with the specified name.

fn system*(command: str): int

Invokes the command processor to execute a command. Returns a platform-specific result.

Functional programming library: fnc.um

Types

type Array* = []any

Array of any items.

Functions

fn (a: ^Array) transform*(f: fn (x: any): any): Array

Computes the function f for each item x of the array a^ and returns the array of results.

fn (a: ^Array) filter*(f: fn (x: any): bool): Array 

Computes the function f for each item x of the array a^ and returns the array of all the items of a^ for which f evaluates to true.

fn (a: ^Array) reduce*(f: fn (x, y: any): any): any

Computes the function f for each item y of the array a^ starting from index i = 1 to len(a^) - 1. The previous result of f computed for items 1 to i - 1 is passed as x. For i = 1 it is assumed that x = a[0]. Returns the result of f computed for the last item of a^.

Example:

import "fnc.um"

fn main() {
    data := []int{3, 7, 1, -4, 2, 5}
    printf("Array = %v\n", data)

    max := 30
     
    sqr  := fn (x: any): any        {return int(x) * int(x)}
    less := fn (x: any): bool |max| {return int(x) < max} 
    sum  := fn (x, y: any): any     {return int(x) + int(y)}     
    
    result := int(fnc::Array(data).transform(sqr).filter(less).reduce(sum))   
    printf("Sum of all squares less than %lld = %lld \n", max, result)     
}

3D vector/matrix library: mat.um

Vector operations

Types

type Vec* = [3]real

A 3D vector.

Functions

fn (u: ^Vec) add*(v: Vec): Vec         // Addition: u + v
fn (u: ^Vec) sub*(v: Vec): Vec         // Subtraction: u - v
fn (u: ^Vec) mul*(a: real): Vec        // Multiplication by a scalar: u * a 
fn (u: ^Vec) div*(a: real): Vec        // Division by a scalar: u / a
fn (u: ^Vec) dot*(v: Vec): real        // Dot product: u * v
fn (u: ^Vec) cross*(v: Vec): Vec       // Cross product: u x v
fn (u: ^Vec) elementwise*(v: Vec): Vec // Element-wise multiplication
fn (v: ^Vec) norm*(): real             // Norm: |v|
fn (v: ^Vec) normalize*(): Vec         // Normalized vector: v / |v|

Matrix operations

Types

type Mat* = [3]Vec

A 3x3 matrix.

Functions

fn (m: ^Mat) add*(n: Mat): Mat         // Addition: m + n
fn (m: ^Mat) sub*(n: Mat): Mat         // Subtraction: m - n
fn (m: ^Mat) mul*(a: real): Mat        // Multiplication by a scalar: m * a 
fn (m: ^Mat) div*(a: real): Mat        // Division by a scalar: m / a
fn (m: ^Mat) mulv*(v: Vec): Vec        // Multiplication by a vector: m * v
fn (m: ^Mat) mulm*(n: Mat): Mat        // Multiplication by a matrix: m * n
fn identity*(): Mat                    // Identity matrix 
fn (m: ^Mat) transpose*(): Mat         // Transpose 
fn (m: ^Mat) normalize*(): Mat         // Orthogonalized matrix

Rotations

Functions

fn (v: ^Vec) toRateMat*(): Mat

Returns the skew-symmetric angular rate matrix o given the angular rate vector v, such that for any attitude matrix m, its value after the infinitesimal time interval dt will be m + m * o * dt.

fn (v: ^Vec) toAttMat*(): Mat

Returns the attitude matrix m given the attitude angles (roll, pitch, yaw) formally combined into the vector v. Attitude angles are in radians. Any vector u can be transformed from the rotating to the non-rotating coordinate system as m * u.

fn (m: ^Mat) toAttAngles*(): Vec 

Returns the attitude angles (roll, pitch, yaw) formally combined into a vector given the attitude matrix m. Attitude angles are in radians. Any vector u can be transformed from the rotating to the non-rotating coordinate system as m * u.

Unicode library: utf8.um

Types

type Rune* = int32                                

A rune, i.e., an integer value identifying a Unicode code point.

Constants

const (
    errRune* = Rune(0xFFFD)
    errStr* = "\xEF\xBF\xBD"                          
)

The invalid rune and its UTF-8 encoding. Returned from functions on encoding/decoding errors.

Functions

fn (r: ^Rune) size*(): int

Returns the size in bytes of the rune r encoded in UTF-8.

fn (r: ^Rune) encode*(): str

Returns the string encoded in UTF-8 corresponding to the rune r.

fn encode*(runes: []Rune): str

Returns the string encoded in UTF-8 corresponding to the array runes.

fn decodeRune*(chars: []char, pos: int = 0): Rune

Returns the rune contained in the array chars starting at index pos.

fn decode*(s: str): []Rune

Returns the array of runes corresponding to the string s encoded in UTF-8.

fn runeCount*(s: str): int

Returns the number of runes contained in the string s encoded in UTF-8.