docs/imports.md
All import paths are case-sensitive. Ensure that the case used in import statements matches exactly with the file and directory names.
Imports can be declared two ways:
from path import name
# or
import path/name
# We recommend always placing the imports at the top of the file.
Let's assume we have a bend project with the following structure:
my_project/
├── main.bend
├── utils/
│ ├── helper.bend
│ │ └── def calc
│ └── math.bend
│ ├── def add
│ └── def subtract
Paths starting with ./ or ../ are imported relative to the file.
# if used inside `my_project/*.bend`
from ./utils import helper
# if used inside `my_project/*/*.bend`
import ../utils/helper
This will bind calc from helper.bend as helper/calc.
Otherwise, paths imported are relative to the folder of the main file.
from utils import math
# or
import utils/math
This will bind add and subtract from math.bend as math/add and math/subtract.
You can import specific top-level names from a file.
from utils/helper import calc
from utils/math import (add, subtract)
# or
import (utils/helper/calc, utils/math/add, utils/math/subtract)
# or
import utils/helper/calc
import utils/math/add
import utils/math/subtract
This will bind the names calc, add and subtract from their respective files.
You can import all top-level names from a file using the wildcard *.
from utils/math import *
This will bind the names add and subtract from math.bend.
.bend Files from a FolderYou can import all .bend files from a folder using the wildcard *.
from utils import *
This will bind the names from helper.bend and math.bend, as helper/calc, math/add and math/subtract.
You can alias imports to a different name for convenience.
Import the file top-level name from file.bend aliased to alias, and all other names as alias/name.
from utils import helper as utilsHelper
import utils/math as mathLib
This will bind the names from helper.bend and math.bend, as utilsHelper/calc, mathLib/add and mathLib/subtract.
You can import specific top-level names and alias them to different names.
from utils/helper import calc as calcFunc
from utils/math import (add as addFunc, subtract as subFunc)
# or
import (utils/math/add as addFunc, utils/math/subtract as subFunc)
This will bind calc, add and subtract as calcFunc, addFunc and subFunc from their respective files.
Let's assume we have a bend project with the following structure:
my_project/
├── main.bend
├── types/
│ ├── List.bend
│ │ └── type List: Nil | (Cons ..)
│ └── List/
│ ├── concat.bend
│ │ └── def concat
│ └── append.bend
│ └── def append
│ └── def helper
You can import a data type and its constructors by only importing its name.
from types/List import List
# behaves the same as
from types/List import (List, List/Nil, List/Cons)
Importing only List from List.bend will import the type List and bind its constructors name List/Nil and List/Cons.
When a file and a top-level name in it share a name, for example, List.bend, concat.bend and append.bend, the bind of that import is simplified to the file name.
from types/List import append
This will bind append and append/helper from append.bend.
When files and directories share a name, both share the import namespace:
from types/List import (List, concat)
This will attempt to import from both the List.bend file and the List folder, resulting in the binds List/Nil, List/Cons and concat.
from types/List import *
This will import all the names from List.bend, then all the files inside the List folder, resulting in the binds List/Nil, List/Cons, concat, append and append/helper.
In both cases, if a name is present as a top-level name on the file, and as a .bend file name inside the folder, it will result in an error.
If you only want to import List.bend and not search the files in its folder, you can use the import path syntax:
import types/List