2024-06-20 23:08:47 +03:00
# Import System
2024-07-03 08:02:47 +03:00
## Case Sensitivity
All import paths are case-sensitive. Ensure that the case used in import statements matches exactly with the file and directory names.
## Syntax
Imports can be declared two ways:
```py
from path import name
# or
import path/name
```
## Project Structure
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
```
2024-06-20 23:08:47 +03:00
## Importing Relative Paths
Paths starting with `./` or `../` are imported relative to the file.
### Example:
```py
2024-07-03 08:02:47 +03:00
# if used inside `my_project/*.bend`
2024-06-20 23:08:47 +03:00
from ./utils import helper
2024-07-03 08:02:47 +03:00
# if used inside `my_project/*/*.bend`
import ../utils/helper
2024-06-20 23:08:47 +03:00
```
2024-07-03 08:02:47 +03:00
This will bind `calc` from `helper.bend` as `helper/calc` .
2024-06-20 23:08:47 +03:00
## Importing Absolute Paths
Otherwise, paths imported are relative to the folder of the main file.
### Example:
```py
2024-07-03 08:02:47 +03:00
from utils import math
# or
import utils/math
2024-06-20 23:08:47 +03:00
```
2024-07-03 08:02:47 +03:00
This will bind `add` and `subtract` from `math.bend` as `math/add` and `math/subtract` .
2024-06-20 23:08:47 +03:00
## Importing Specific Top-Level Names
You can import specific top-level names from a file.
### Example:
```py
2024-07-03 08:02:47 +03:00
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
2024-06-20 23:08:47 +03:00
```
2024-07-03 08:02:47 +03:00
This will bind the names `calc` , `add` and `subtract` from their respective files.
2024-06-20 23:08:47 +03:00
## Importing All Names
You can import all top-level names from a file using the wildcard `*` .
2024-07-03 08:02:47 +03:00
### Example:
2024-06-20 23:08:47 +03:00
```py
2024-07-03 08:02:47 +03:00
from utils/math import *
2024-06-20 23:08:47 +03:00
```
2024-07-03 08:02:47 +03:00
This will bind the names `add` and `subtract` from `math.bend` .
2024-06-20 23:08:47 +03:00
## Importing All `.bend` Files from a Folder
You can import all `.bend` files from a folder using the wildcard `*` .
2024-07-03 08:02:47 +03:00
### Example:
2024-06-20 23:08:47 +03:00
```py
2024-07-03 08:02:47 +03:00
from utils import *
2024-06-20 23:08:47 +03:00
```
2024-07-03 08:02:47 +03:00
This will bind the names from `helper.bend` and `math.bend` , as `helper/calc` , `math/add` and `math/subtract` .
2024-06-20 23:08:47 +03:00
## Aliasing Imports
You can alias imports to a different name for convenience.
### Importing a File with Alias
Import the `file` top-level name from `file.bend` aliased to `alias` , and all other names as `alias/name` .
### Example:
```py
from utils import helper as utilsHelper
2024-07-03 08:02:47 +03:00
import utils/math as mathLib
2024-06-20 23:08:47 +03:00
```
2024-07-03 08:02:47 +03:00
This will bind the names from `helper.bend` and `math.bend` , as `utilsHelper/calc` , `mathLib/add` and `mathLib/subtract` .
2024-06-20 23:08:47 +03:00
### Importing Specific Names with Aliases
You can import specific top-level names and alias them to different names.
2024-07-03 08:02:47 +03:00
### Example:
2024-06-20 23:08:47 +03:00
```py
2024-07-03 08:02:47 +03:00
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)
2024-06-20 23:08:47 +03:00
```
2024-07-04 14:51:28 +03:00
This will bind `calc` , `add` and `subtract` as `calcFunc` , `addFunc` and `subFunc` from their respective files.
2024-07-03 08:02:47 +03:00
2024-07-04 14:51:28 +03:00
## Project Structure
2024-07-03 08:02:47 +03:00
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
2024-07-04 14:51:28 +03:00
│ └── def helper
```
## Importing data types
You can import a data type and its constructors by only importing its name.
### Example:
```py
from types/List import List
# behaves the same as
from types/List import (List, List/Nil, List/Cons)
2024-07-03 08:02:47 +03:00
```
2024-07-04 14:51:28 +03:00
Importing only `List` from `List.bend` will import the type `List` and bind its constructors name `List/Nil` and `List/Cons` .
## Importing files with a top level name equal to its name
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.
### Example:
```py
from types/List import append
```
This will bind `append` and `append/helper` from `append.bend` .
## Files and directories with the same name
2024-07-03 08:02:47 +03:00
When files and directories share a name, both share the import namespace:
2024-06-20 23:08:47 +03:00
```py
2024-07-03 08:02:47 +03:00
from types/List import (List, concat)
2024-06-20 23:08:47 +03:00
```
2024-07-03 08:02:47 +03:00
2024-07-04 14:51:28 +03:00
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` .
2024-07-03 08:02:47 +03:00
```py
from types/List import *
```
2024-07-04 14:51:28 +03:00
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:
2024-07-03 08:02:47 +03:00
2024-07-04 14:51:28 +03:00
```py
2024-07-04 20:44:36 +03:00
import types/List
2024-07-04 14:51:28 +03:00
```