Syntaxe
Déclare un bloc de code nommé qui reçoit des paramètres et peut rendre une valeur. Il s’exécute jusqu’au bout d’une traite, dans l’image en cours.
FUNCTION <name>([<parameter>, …]) [AS <type>]
EXITFUNCTION [<value>]
RETURN [<value>]
ENDFUNCTION [<value>]
Procedure <name>([<parameter>, …]) [AS <type>]
ProcedureReturn [<value>]
EndProcedure
<parameter> = [OPTIONAL] <param> [AS <type>] [= <default>]
<parameter> = PARAMARRAY <param> [AS <type>]
<parameter> = <param> [AS <type>]...S’écrit aussi : ENDFUNCTION, EXITFUNCTION, Procedure, EndProcedure, ProcedureReturn, OPTIONAL, PARAMARRAY
Les éléments
| <name> | Le nom de la fonction. La casse ne compte pas. Un sigil ($, #, %, &) peut le terminer, à titre d’étiquette seulement. |
|---|---|
| <parameter> | Un paramètre, sous l’une des trois formes ci-dessous. Séparez-les par des virgules. La liste peut être vide. |
| <type> | Un type numérique, string, HANDLE, un TYPE déclaré, ou un tableau de ceux-ci (integer[], jusqu’à six []). Sur la fonction, il convertit toute valeur rendue. |
| <value> | La valeur rendue. Facultative : sans elle, la fonction ne rend rien, ou la valeur par défaut de son type AS. |
| <param> | Le nom du paramètre, local à la fonction. |
| <default> | La valeur prise quand l’appelant omet l’argument. Elle est calculée à chaque appel et peut utiliser un paramètre précédent. |
Rend
La valeur placée après ENDFUNCTION, EXITFUNCTION ou RETURN, convertie dans le type AS s’il y en a un. Sans valeur : rien (undefined à l’affichage), ou la valeur par défaut du type AS (0, "", un enregistrement vide).
À savoir
ENDFUNCTIONetEXITFUNCTIONs’écrivent en un mot.END FUNCTIONest refusé (« FUNCTION requires ENDFUNCTION »).EXIT FUNCTIONen deux mots n’est pas refusé, mais le programme ne peut pas tourner.- Un appel porte toujours ses parenthèses, même sans argument :
showTitle(). UnshowTitlenu se compile comme une variable et n’échoue qu’à l’exécution. - Déclarez les fonctions au premier niveau du fichier, jamais dans un
IF, une boucle ou une autre fonction. On peut appeler une fonction au-dessus de sa déclaration. Une fonction utilisateur l’emporte sur la commande du catalogue de même nom. - Un sigil sur le nom ne convertit rien :
whole%(9.8)sansASrend 9.8.title$("x")ettitle("x")appellent la même fonction. Pour convertir, écrivezAS integerouAS string. OPTIONALsans valeur par défaut donne la valeur par défaut du type du paramètre. Un sigil ne le type pas :OPTIONAL name$reçoit 0, pas""; écrivezOPTIONAL name AS string. Un paramètre obligatoire ne peut pas suivre un paramètre facultatif, etf(1, , 5)ne saute pas l’argument du milieu : 5 arrive dans le deuxième paramètre.- Un paramètre variadique (
PARAMARRAY valuesouvalues...) est le dernier, n’a pas de valeur par défaut et ne peut pas êtreREF. Avec un type, écrivezvalues AS float...;values... AS floatest refusé. Son.lengthest le dernier indice : trois valeurs donnent 2, aucune donne -1. - Un paramètre sans type partage un enregistrement ou un tableau avec l’appelant. Un paramètre typé en reçoit une copie. Pour modifier exprès la variable de l’appelant, utilisez
REF. - Plusieurs fonctions peuvent porter le même nom si leurs nombres d’arguments ne se recouvrent pas. Le compilateur choisit d’après le nombre seul, jamais d’après le type. Des plages qui se recouvrent donnent « Ambiguous BASIC overload ».
- Rien de ce qui attend n’est permis dans une fonction :
END, Wait(), Sleep(),AWAITTASK,AWAITALLetAWAITANYsont refusés. Sync(), Swap() etYieldTask()sont acceptés, mais avec unDO … LOOPle programme ne peut pas démarrer. Attendez dans la boucle principale, un sous-programmeGOSUBou une tâche. - Dans un programme avec
DO … LOOP, une fonction ne voit pas les variables simples posées au-dessus duDO. Déclarez les valeurs partagées avecGLOBAL, et activezOPTION EXPLICIT. - PureBasic :
Procedure,ProcedureReturnetEndProceduresont des alias deFUNCTION,EXITFUNCTIONetENDFUNCTION. La forme typéeProcedure.s Name()est refusée : écrivezProcedure Name() AS string. Visual Basic aSub; ici, une FUNCTION qui ne rend rien joue ce rôle.
Exemple
FUNCTION Greet(name AS string = "stranger", OPTIONAL mark AS string) AS stringENDFUNCTION "Hello " + name + markFUNCTION Total(PARAMARRAY values AS integer) AS integer LOCAL sum AS integer = 0 FOR i = 0 TO values.length sum = sum + values[i] NEXT iENDFUNCTION sumFUNCTION Sign(n) IF n < 0 THEN EXITFUNCTION -1ENDFUNCTION 1Console(Greet()) ' Hello strangerConsole(Greet("Ada", "!")) ' Hello Ada!Console(Str(Total(2, 4, 9))) ' 15Console(Str(Sign(-5))) ' -1Dans le manuel : Fonctions