FUNCTIONS


Zie ook:  Functions and Subroutines, BYREF

function functionName(nul of meer namen van variabelen als parameter)
  'code for the function goes in here
  functionName = returnValueExpression
end function

Beschrijving: 
Dit statement bepaalt een functie.  De functie kan met een stringwaarde, of een numerieke waarde terugkeren. 
Een functie die een stringwaarde terugkeert moet een naam hebben die met het "$" karakter beŽindigt.  
Een functie die een numerieke waarde terugkeert moet geen "$" in zijn naam omvatten. 
Nul of meer parameters kunnen aan de functie worden meegegeven.  
Een functie kan geen andere functiedefinitie, noch een subroutinedefinitie bevatten.  
Merk op dat het haakje openen eigenlijk een deel van de functienaam is. 
Zet geen spatie tussen de naam en het open haakje, of de code produceert een fout.

Goed:
function functionName(var1, var2)

Fout:
function functionName (var1, var2)

Terugkeren met een waarde
Om met een waarde van de functie terug te keren, wijs de waarde die van de functie ontvangen moet worden 
toe aan een variabele met dezelfde naam als de functie.  Als geen terugkeerwaarde 
wordt gespecificeerd, dan zullen de numerieke en stringfuncties met 
respectievelijk 0 en lege string terugkeren.

  functionName = returnValueExpression

Lokale Variabelen
Elke variabele binnen een functie is plaatselijk geldig (local scope), 
dat betekent dat de (lokale) waarde van de variabele binnen een functie, 
verschilt van de waarde van een variabele met de zelfde naam buiten de functie. 

Variabelen meegeven door een verwijzing (Passing by reference) naar een geheugen adres 
Normaliter worden (de argumenten) variabelen die meegegeven worden aan een functie 
als een vaste waarde "by value" doorgegeven hetgeen betekent dat een exemplaar 
van de variabele in de functie wordt overgenomen. 
We zagen reeds dat de waarde van de variabele niet veranderd in het hoofdprogramma 
ook als het in de functie wel veranderd. De variabele in de functie was lokaal. 
Een variabele kan in plaats daarvan echter ook "byref" worden meegegeven 
wat betekent dat een verwijzing naar de daadwerkelijke variabele wordt meegegeven, 
waardoor een verandering in de waarde van deze variabele in de functie 
nu wel tevens de waarde van de variabele in het hoofdprogramma verandert. 
Deze variabelen zijn (global scope)

Global Variables and Devices
Variabelen die met het GLOBAL statement worden gedeclareerd zijn beschikbaar 
in het hoofdprogramma en in subroutines en functies.

Arrays, structs en handles van bestaande, DLLs en vensters  zijn "global" 
voor een Liberty BASIC programma, en zichtbaar binnen een functie 
zonder de noodzaak ze special aan die functie mee te geven.

Speciale "global"status is gegeven aan enkele standaard variabelen die 
gebruikt worden om de grootte, positie en kleur van vensters en controls te regelen. 
Het betreft hier inclusief de variabelen voor 
WindowWidth, WindowHeight, UpperLeftX, UpperLeftY, ForegroundColor$, 
BackgroundColor$, ListboxColor$, TextboxColor$, ComboboxColor$, TexteditorColor$. 
De waarde van deze variabelen, als ook die van DefaultDir$ en com 
kunnen gezien worden en gewijzigd worden in elke subroutine/function.

Branch Labels
De aftak etiketten worden plaatselijk gezien.  
De code binnen een functie kan geen aftak etiketten buiten de subroutine zien, 
en de code buiten een functie kan geen aftak etiketten binnen 
om het even welke subroutine zien.

End Function
Elke gedefinieerde functie moet eindigen met de uitdrukking "end function"

Exit Function
Elke functie kan voortijdig worden verlaten met de uitdrukking "exit function" 

Executing Functions
Zorg ervoor dat een programma niet toevallig binnen een functie stroomt.  
Een functie zou slechts moeten worden uitgevoerd wanneer het 
op bevel van het programma wordt aangeroepen.


fout:
    for i = 1 to 10
        'do some stuff
    next i

    Function MyFunction(param1, param2)
        'do some stuff
        MyFunction=value
    End Function

correct:
    for i = 1 to 10
        'do some stuff
    next i

    WAIT 

    Function MyFunction(param1, param2)
        'do some stuff
        MyFunction=value
    End Function

Voorbeeld:

'count the words
input "Type a sentence>"; sentence$

print "There are "; wordCount(sentence$); " words in the sentence."
end

function wordCount(aString$)
  index = 1
  while word$(aString$, index) <> ""
    index = index + 1
  wend
  wordCount = index - 1
end function


Zie ook: SUB , Recursion, Functions and subroutines


Function functionName(byref var1, byref var2$...)

Beschrijving: Variabelen worden standaard "by value" als argumenten aan functies en aan subs meegegeven, hetgeen betekent dat slechts een kopie van de variabele in de functie of sub wordt overgenomen. De waarde van de variabele wordt daardoor niet veranderd in het hoofdprogramma ook als het in de functie wel veranderd. Een variabele kan in plaats daarvan "byref" worden meegegeven, wat betekent dat een verwijzing naar de daadwerkelijke (geheugenplek) variabele wordt meegegeven, waardoor een verandering in de waarde van deze variabele in de functie of sub wel verandering van de waarde van de variabele in het hoofdprogramma geeft. Zie ook: Functie, Sub, Functies en Subroutines Gebruik: Elk van de parameters in de functie en sub in dit voorbeeld gebruikt de "byref" specificatie. Dit betekent dat wanneer de waarde van a en b in de functie worden veranderd dat dan ook de variabelen die worden gebruikt om de vraag (x en y) te maken zullen veranderen om op a en b te wijzen wanneer de functie terugkeert. Probeer door dit voorbeeld te stappen met debugger. 'now you can pass by reference x = 5.3 y = 7.2 result$ = formatAndTruncateXandY$(x, y) print "x = "; x print "y = "; y print result$ 'and it works with subroutines too wizard$ = "gandalf" call capitalize wizard$ print wizard$ end function formatAndTruncateXandY$(byref a, byref b) a = int(a) b = int(b) formatAndTruncateXandY$ = str$(a)+", "+str$(b) end function sub capitalize byref word$ word$ = upper$(left$(word$, 1))+mid$(word$, 2) end sub Meer over "pass by reference" Het meegeven "byref" wordt alleen ondersteund bij gebruik van string en numerieke variabelen als parameters. U kunt een numeriek of letterlijk string, of berekening van gegevens of een string meegeven, of zelfs een waarde van een array, maar de waarden zullen niet van de call terugkomen. Stap door het voorbeeld met de debugger om te zien hoe het werkt! 'you can also call without variables, but the changes 'don't come back result$ = formatAndTruncateXandY$(7.2, 5.3) print result$ 'and it works with subroutines too call capitalize "gandalf" a$(0) = "snoopy" call capitalize a$(0) end function formatAndTruncateXandY$(byref a, byref b) a = int(a) b = int(b) formatAndTruncateXandY$ = str$(a)+", "+str$(b) end function sub capitalize byref word$ word$ = upper$(left$(word$, 1))+mid$(word$, 2) end sub