Skip to content

Modules

Import statements import the whole module and assign it to a variable. Specific things from the module cannot be imported, such as JavaScript's import { function } from pkg or Python's from pkg import function. Wildcard imports like Python's from pkg import * are also not allowed.

import "std/math" as math;

float phi = (math.sqrt(5.0) + 1.0) / 2.0;

This is beneficial because different modules can export functions with the same name, and it'll always be clear where each function came from, at the cost of typing slightly more.

Each file is a module, and you can import from files by using the import keyword, and assign it to a variable with as.

import "path/to/mod" as some_mod;

This variable is a special struct containing all of the exported symbols from a module, along with their (non-exported) dependencies. This is useful, for instance, if an exported function has side effects. For example:

// std/math

pub float PI = 3.14159265358979323;

pub uint MIN_UINT = 0;
pub uint MAX_UINT = 0xffffffffffffffff;

pub int MIN_INT = -0x7fffffffffffffff;
pub int MAX_INT = 0x7fffffffffffffff;

// random number generator
// this is an example of something that might depend on non-exported symbols
int A = 8121;
int C = 28411;
int M = 134456;
mut int seed = 123456789;
pub fn random_LCG() -> int {
  seed = (A * seed + C) % M;
  return seed;
}

would get turned into:

module {
  pub float PI = 3.14159265358979323;

  pub uint MIN_UINT = 0;
  pub uint MAX_UINT = 0xffffffffffffffff;

  pub int MIN_INT = -0x7fffffffffffffff;
  pub int MAX_INT = 0x7fffffffffffffff;

  mut int seed = 123456789;
  pub fn random_LCG() -> int {
    seed = (8121 * seed + 28411) % 134456;
    return seed;
  }
}

You would then be able to use this as:

import "std/math" as math;

println("pi = {math.PI}"); // pi = 3.14159265358979323
println("{math.MIN_UINT} <= uint <= {math.MAX_UINT}"); // 0 <= uint <= ...
println(random_LCG()); // 69376

Exporting symbols

As noted in the example above, symbols can be exported using the pub keyword. This includes variables, functions, etc.

There are some additional rules for exporting fields and methods in structs, which you can read about in the structs documentation.