# Core : fonctions et modules

Source : https://docs.berkios.online/core/fonctions-et-modules/ · Section : Core · Documentation officielle BERKIOS (https://docs.berkios.online)


## Écrire une fonction

Une fonction déclare ses paramètres et son type de retour :

```text
fonction calculer_remise(prix: Decimal, pourcentage: Decimal) -> Decimal
  retourner prix * pourcentage / 100
```

Appelez-la comme n'importe quelle valeur : `soit remise = calculer_remise(125.0, 15.0)`.

## Découper un programme en modules

Quand un programme grandit, séparez-le en plusieurs fichiers. Voici deux fichiers dans le même dossier.

**`maths-fr.bks`**

```text nocheck
module "Mathématiques"
fonction doubler(nombre: Decimal) -> Decimal
  retourner nombre * 2

fonction calculer_remise(prix: Decimal, pourcentage: Decimal) -> Decimal
  retourner prix * pourcentage / 100
```

**`main-fr.bks`**

```text nocheck
module "Application de vente"
importer "maths-fr.bks"

fonction principale() -> Entier
  soit prix = 125.0
  soit pourcentage = 15.0
  soit remise = calculer_remise(prix, pourcentage)
  soit total = prix - remise
  afficher "Remise :"
  afficher remise
  afficher "Total à payer :"
  afficher total
  afficher doubler(10)
  retourner 0
```

```bash
berkios core main-fr.bks
```

Résultat :

```text
Remise :
18.75
Total à payer :
106.25
20
```

## Règles des imports

- `importer "fichier.bks"` est résolu **par rapport au fichier qui l'écrit**.
- Les cycles d'import (A importe B qui importe A) sont détectés et refusés.
- Alias selon la langue : `import` (anglais), `importar` (espagnol), `agiza` (swahili).

## Fonctions génériques

Une fonction générique accepte plusieurs types. Le compilateur devine `T` à partir des arguments puis vérifie les types :

```text
type Boite<T>
  valeur: T

fonction principale() -> Entier
  soit boite: Boite<Entier> = Boite(42)
  afficher boite.valeur
  retourner boite.valeur
```

Suite : [Types, classes et héritage](https://docs.berkios.online/core/classes-et-types/).
