Chapter 7

Modules

Organizing and reusing code

Import Syntax

Nevaarize supports two types of imports:

  1. Standard Library — Built-in modules
  2. File Imports — Your own .nva files

Standard Library Imports

Import built-in modules with the stdlib keyword:

// Import syntax: import stdlib [module] as [alias]
import stdlib math as m
import stdlib time as t
import stdlib io as io

// Use imported functions
print(m.Sqrt(16))     // 4.0
print(m.Pow(2, 10))   // 1024.0
print(t.clock())      // current time

Available Standard Libraries

Module Description Key Functions
math Mathematical operations Abs, Sqrt, Pow, Sin, Cos, Floor, Ceil
time Time and timing clock, sleep, timestamp, format
io Input/Output Print, Input, ReadFile, WriteFile

File Imports

Import your own .nva files as modules:

// Import a local file
import "utils/helpers.nva" as helpers
import "config.nva" as config

// Use imported functions
result = helpers.calculate(10)
print(config.appName)

Creating a Module

Any .nva file can be a module. Here's an example:

File: utils/math.nva

// utils/math.nva - Custom math utilities

// Constants
PI = 3.14159265359

// Functions that will be available to importers
func square(x) {
    return x * x
}

func cube(x) {
    return x * x * x
}

func circleArea(radius) {
    return PI * radius * radius
}

func clamp(value, minVal, maxVal) {
    if (value < minVal) {
        return minVal
    }
    if (value > maxVal) {
        return maxVal
    }
    return value
}

File: main.nva

// main.nva - Using the module
import "utils/math.nva" as myMath

print("Square of 5:", myMath.square(5))
print("Cube of 3:", myMath.cube(3))
print("Circle area (r=2):", myMath.circleArea(2))
print("Clamped value:", myMath.clamp(150, 0, 100))

Module Best Practices

1. One Purpose Per Module

// Good: Single responsibility
// validation.nva - Only validation functions
func isEmail(s) { ... }
func isPhone(s) { ... }
func isRequired(s) { ... }

// Bad: Mixed concerns
// stuff.nva - Random utilities
func isEmail(s) { ... }
func calculateTax(amount) { ... }
func formatDate(d) { ... }

2. Use Clear Aliases

// Good: Descriptive aliases
import "validators/user.nva" as userValidator
import "formatters/date.nva" as dateFormatter

// Usage is clear
userValidator.isValid(user)
dateFormatter.toISO(date)

// Bad: Unclear aliases
import "validators/user.nva" as v
import "formatters/date.nva" as d

// Hard to understand
v.isValid(user)
d.toISO(date)

3. Project Structure

myproject/
├── main.nva              # Entry point
├── config.nva            # Configuration
├── modules/
│   ├── auth.nva          # Authentication
│   ├── database.nva      # Database operations
│   └── api.nva           # API handlers
├── utils/
│   ├── validation.nva    # Validation helpers
│   ├── formatting.nva    # String formatting
│   └── logging.nva       # Logging utilities
└── tests/
    └── test_auth.nva     # Tests