Fonctions

Inkling n’est pas un langage de programmation à usage général. Au lieu de cela, Inkling s’exécute dans le contexte de flux de données pendant l’apprentissage du cerveau. Par conséquent, le langage ne prend en charge que le comportement de fonction de base.

Pris en charge

  • paramètres d’entrée et de sortie (retour) typés.
  • variables typées.
  • instructions conditionnelles (if/else).

Non pris en charge

  • conservation de l’état entre les appels de fonction.
  • constructions de boucle.
  • récursivité directe ou indirecte.
  • try/catch et exceptions.
  • surcharge de fonction.
  • paramètres par défaut.
  • nombre variable de paramètres.

L’utilisation de fonction non prise en charge est signalée comme une erreur par le compilateur Inkling, et désactive l’apprentissage du cerveau.

Appels de fonction

Les appels de fonction suspendent l’exécution dans le contexte d’exécution actuel, et démarrent un nouveau contexte pour exécuter la fonction. Le contexte appelant doit fournir tous les paramètres appropriés. Et les types de toutes les valeurs fournies doivent correspondre (ou être transtypables) aux types de paramètres déclarés.

L’instruction return met fin à l’exécution de la fonction et retourne la valeur spécifiée au contexte appelant. Pour les fonctions avec des types de retours explicites :

  • le type de la valeur de retour doit correspondre au type de retour fourni ;
  • si plus d’une instruction de retour sont utilisées, tous les types de retours doivent correspondre.
  • Si le type de retour a une plage explicite, les valeurs de retour en dehors de la plage sont arrondies à la valeur valide la plus proche dans la plage. Par exemple, si le type de retour est number<1..3> et que la valeur de retour calculée est 5, la fonction retourne 3.

Si aucun type de retour n’est spécifié, le compilateur déduit le type en fonction des valeurs retournées.

Exemples d’appels de fonction

# Function call with no arguments
MyFunc()

# Function call with multiple arguments
MyFunc(X, Y)

Définition de fonction

Les définitions de fonction dans l’espace de noms global incluent le mot clé function, un nom, une liste facultative de paramètres d’entrée typés, et un type de paramètre de sortie facultatif. Des fonctions inline peuvent omettre le nom de fonction.

Les noms de fonction suivent les règles d’identificateur Inkling standard.

Définition de fonction standard

function RadiansToDegrees(Radians: number): number {  
  return Radians * 180 / Math.Pi
}

...

var XDegrees = RadiansToDegrees(Math.Pi)

Définition de fonction inline

var XDegrees = function(Radians: number):number {
  return Radians * 180 / Math.Pi
}

Notes

Toutes les fonctions doivent retourner une valeur, mais la définition du type de retour peut être omise si le compilateur peut inférer le type de retour.

Variables

Des variables ne peuvent être déclarées que dans une fonction. Toutes les variables ont une étendue au niveau d’une fonction, même quand elles sont déclarées dans une sous-étendue comme une instruction if/else. Par conséquent, les noms de variables doivent être uniques dans une fonction donnée.

Les définitions de type de variable sont facultatives quand le compilateur peut inférer le type à partir d’une attribution de valeur initiale. Des déclarations de type explicites sont requises quand le type ne peut pas être inféré.

Déclaration de variable non attribuée

Le code suivant déclare une variable number contrainte à la plage comprise entre 1 et 3 (inclus).

var OneToThree: number<1 .. 3>

Déclaration de variable attribuée

Le code suivant déclare et attribue une variable sans attribuer de type explicite. Le compilateur peut inférer le type (number) en fonction de la valeur initiale.

var TwoOrThree = 2

Le code suivant déclare une variable et attribue une valeur initiale. Pour appliquer une restriction d’énumération favorite, une attribution de type explicite est également fournie.

var TwoOrThree: number<2, 3> = 2

Important

Une valeur doit être attribuée à toutes les variables avant leur utilisation. Les variables sans valeur attribuée génèrent des erreurs de compilation.

Exécution conditionnelle

Inkling prend en charge les instructions if/else. Des accolades sont requises pour tous les blocs de code conditionnel.

if IsZero(Input) {
  # 0 is a special value
  return 0
} else if IsOdd(Input) {
  # Convert odd numbers to 1
  return 1
} else if IsEven(Input) {
  # Convert even numbers to 2
  return 2
} else {
  # How did you even get here?
  return -1
}