Imports
Imports in Althread are designed to be quite straightforward, maintaining simplicity and clarity.
Basic Import Syntax
A single import block can be declared anywhere in your file. It contains a list of relative paths from the importing file to the target file, without the .alt extension (for importing modules organized with mod.alt files, see the Modules & Packages guide):
import [
math,
cool/fib,
display
]
Each item in the import list is a relative filepath. When importing from a subdirectory like cool/fib, the module becomes available under its filename (fib in this case).
Accessing Imported Elements
Once imported, you access elements from modules using dot notation:
import [
math,
cool/fib,
display
]
main {
// Call a function from 'math'
let result = math.max(5, 10);
print(result);
// Access shared variable from 'cool/fib'
print(fib.N);
// Modify shared variables
fib.N = 15;
// Call functions from modules
let fibResult = fib.fibonacci_iterative_N();
// Run programs from modules
run display.Hello();
}
Aliasing
If you have naming conflicts or prefer shorter names, you can use aliasing with the as keyword:
import [
math,
cool/fib as fibonacci,
display as d
]
main {
print(math.max(7, 3));
print(fibonacci.N);
run d.Hello();
}
Privacy Control
Althread provides the @private directive to control access to module elements:
- Functions marked with
@privatecannot be accessed from importing files programblocks can also be marked as@private- Multiple
mainblocks can coexist if marked as@private - Shared variables are always importable and modifiable
- Conditions (always/never/eventually) are imported but read-only
// In math.alt
@private
fn internal_helper(x: int) -> int {
return x * 2;
}
fn max(a: int, b: int) -> int {
// This function is public and can be imported
if a > b {
return a;
}
return b;
}
// In main.alt
import [math]
main {
print(math.max(5, 10)); // Works - public function
// math.internal_helper(5); // Error - private function
}
Import Rules and Validation
Althread enforces several rules to maintain code quality:
- No duplicate imports: Each module can only be imported once per file
- Circular import detection: Althread checks for and prevents circular dependencies
- Path validation: Import paths must exist and be valid relative paths
- Unique module names: After aliasing, all imported modules must have unique names
What Gets Imported
When you import a module, you get access to:
- Public functions: Functions without the
@privatedirective - Public programs: Program blocks without the
@privatedirective - Shared variables: All shared variables (always importable and modifiable)
- Conditions: Always/never/eventually conditions (imported as read-only)
Channel Imports
Channels declared in imported modules are handled through a special precompilation phase that scans all imports for channel declarations and adds them to the global compiler context. This ensures proper type inference across module boundaries.
Error Reporting
When errors occur in imported files, Althread provides clear error messages that include:
- The filepath where the error occurred
- An error stack for improved debugging
- Context about which import chain led to the error
Example: Complete Import Usage
Here's a comprehensive example showing various import features:
// main.alt
import [
utils/math,
algorithms/sorting as sort,
display
]
main {
// Use imported functions
let maximum = math.max(15, 23);
print("Maximum: " + maximum);
// Access and modify shared variables
print("Original value: " + sort.threshold);
sort.threshold = 100;
print("Updated value: " + sort.threshold);
// Run imported programs
run display.ShowWelcome();
// Use imported sorting algorithm
let numbers: list(int);
numbers.push(64);
numbers.push(34);
numbers.push(25);
numbers.push(12);
numbers.push(22);
numbers.push(11);
numbers.push(90);
sort.quickSort(numbers);
print("Sorted array: " + numbers);
}
This import system provides a clean, predictable way to organize and share code across your Althread projects while maintaining clear boundaries and access controls.