User defined classes can be created using the class() constructor, see here. Usually classes are defined using a compound declaration.

class(Arg₁, Arg₂, ...)

Creates a new class with additional properties based on the types of Arg₁, Arg₂, ...:


Adds a parent class. Multiple parent classes are allowed.


Adds a field. Instances of this class will have space allocated for all fields, fields cannot be added or removed from instances later. Fields are accessed using the associated method.

Name is Value

Named arguments add shared values to the class. If Class is a class, then Class::Name will return the shared value called Name.

Certain shared values have special meaning. If c is a class, then:

  • The name c::new is always set to a function equivalent to the following:

    1fun(Arg₁, Arg₂, ...) do
    2   let Instance := new instance of c
    3   c::init(Instance, Arg₁, Arg₂, ...)
    4   ret Instance

This cannot be overridden, if new is passed as a named argument to class(), it is ignored.

  • The value of c::init is used as the initializer and should be a callable value (function, method, etc). This value is called by c::new to initialize a new instance c with the given arguments.

    If init is not set, a default initializer is set which assigns positional arguments to the instance fields in order. Any named arguments are assigned to the corresponding field by name.

  • The value of c::of is used as the constructor and should be a callable value (function, method, etc). This value is called when the class is called as a function, i.e. c(...) is equivalent to c::of(...).

    If of is not set, a default constructor is set which simply calls c::new.


Like all types in Minilang, classes can be used to define Methods.


 1class: account(:Balance,
 2   init is fun(Account, Balance) do
 3      Account:Balance := Balance
 4   end
 7meth :deposit(Account: account, Amount: real) do
 8   Account:Balance := old + Amount
11meth :withdraw(Account: account, Amount: real) do
12   Account:Balance := old - Amount
15let Account := account(100)
18print('Balance = {Account:Balance}\n')
Balance = 150