Modules in Sesi
Modules let you split code across .sesi files and reuse it. Use export to expose values from a file and import or allow to bring them in.
---
Exporting
Mark any let binding or fn declaration with export to make it available to other files:
// math.sesi
export fn add(a, b) { return a + b }
export fn multiply(a, b) { return a * b }
export let PI = 3.14159
Only exported names are visible to importers. Everything else stays private to the file.
---
Importing — import
Pull named exports directly into the current scope:
import {
add,
multiply,
PI
} from "math"
print add(10, 20) // 30
print PI // 3.14159
---
Importing — allow
allow is Sesi's scoped import syntax. It has two forms:
Named bindings
Import specific exports directly into scope:
allow "math" in with {
add, multiply
}
print add(3, 4) // 7
Namespace object
Import the entire module under a single identifier:
allow "math" in with Math
print Math.add(3, 4) // 7
print Math.multiply(2, 5) // 10
---
Standard Library Modules
Sesi ships with built-in standard library modules:
| Module | Namespace | Description | |
|---|---|---|---|
std/math |
Math |
Math operations | |
std/time |
Time |
Time/date functions | |
std/json |
JSON |
JSON parsing | |
std/db |
— | Database access |
allow "std/math" in with Math
allow "std/time" in with Time
allow "std/json" in with JSON
print Math.PI
print Time.now()
print JSON.parse("[1,2,3]")
---
Module Resolution Order
When you import "mymodule", Sesi searches for mymodule.sesi in this order:
| Priority | Location | Description | |
|---|---|---|---|
| 1 | Script's own directory | Same folder as the running .sesi file |
|
| 2 | Current working directory | Where you ran sesi from |
|
| 3 | SESI_PATH |
Colon-separated (Unix) or semicolon-separated (Windows) list of paths | |
| 4 | ~/.sesi/lib |
Global shared library, available system-wide |
---
Global Library (~/.sesi/lib)
Copy a module to the global library to make it importable from any project on your system:
# macOS / Unix
cp mymodule.sesi ~/.sesi/lib/
# Windows
copy mymodule.sesi $env:USERPROFILE\.sesi\lib\
// Now importable from anywhere
allow "mymodule" in with { helper, util }
---
Custom Paths (SESI_PATH)
Point SESI_PATH to additional directories for team or monorepo setups:
# macOS / Unix
export SESI_PATH="/mylibs/shared:/projects/common"
# Windows
$env:SESI_PATH = "C:\MyLibs\shared;C:\Projects\common"
---
Quick Reference
// Export
export fn greet(name) { print "Hello," name }
export let VERSION = "2.0"
// import (named)
import { greet, VERSION } from "mymodule"
// allow (named bindings)
allow "mymodule" in with { greet, VERSION }
// allow (namespace)
allow "mymodule" in with Mod
Mod.greet("Ada")
// Standard library
allow "std/math" in with Math
allow "std/time" in with Time
allow "std/json" in with JSON
---