Syntaxe

Crée un handle : une valeur qui désigne une variable. On peut le stocker, le passer et le rendre, puis lire ou écrire la variable à travers lui.

@<target>
<name> AS HANDLE [= @<target>]
<name> AS POINTER [= @<target>]
GetRef(<name>)
SetRef(<name>, <value>)
IsRef(<name>)
ReleaseRef(<name>)

S’écrit aussi : @, HANDLE, POINTER

Les éléments

<target>Ce que le handle désigne : une variable, un champ d’enregistrement (@hero.hp), un élément de tableau (@scores[1]), l’élément courant d’une liste ou une entrée de map (@names("ann")).
<name>Une variable qui contient un handle. HANDLE et POINTER sont le même type. Elle commence vide.
<value>La valeur à écrire dans la cible. Elle est convertie dans le type de la cible.

À savoir

  • @ exige un emplacement qu’on peut affecter. @42 est une erreur de compilation : « BASIC @ requires an assignable variable, field, array, list, or map element ».
  • Un handle garde sa cible en vie : un handle vers une variable LOCAL fonctionne encore après la fin de la fonction.
  • Le type de la cible l’emporte : à travers un handle vers une variable AS uint8, SetRef(p, 300) range 44.
  • Après ReleaseRef(), ou quand l’enregistrement qui porte le champ est supprimé, IsRef() est faux et GetRef() ou SetRef() arrêtent le programme (« BASIC reference handle has been released »). Une variable HANDLE jamais affectée se comporte pareil. Testez IsRef() en cas de doute.
  • Deux handles créés séparément ne sont jamais =, même s’ils désignent la même variable.
  • Un handle n’est pas un nombre, contrairement au @variable de PureBasic : pas d’arithmétique d’adresse, pas de conversion en entier, pas de PeekI ni de PokeI à travers lui.
  • Un paramètre REF vit le temps d’un appel. Un handle vit tant qu’on le garde, et peut être rangé dans un enregistrement ou rendu par une fonction.

Exemple

OPTION EXPLICITGLOBAL gold AS integer = 5FUNCTION AddGold(target AS HANDLE, amount AS integer)  SetRef(target, GetRef(target) + amount)ENDFUNCTIONFUNCTION MakeCounter() AS HANDLE  LOCAL counter AS integer = 0ENDFUNCTION @counterAddGold(@gold, 10)Console(Str(gold))                 ' 15GLOBAL c AS HANDLE = MakeCounter()SetRef(c, GetRef(c) + 1)SetRef(c, GetRef(c) + 1)Console(Str(GetRef(c)))            ' 2ReleaseRef(c)IF NOT IsRef(c) THEN Console("released")   ' released
Dans le manuel : Fonctions