1. Übersicht
YAB ermöglicht die Aufteilung eines Programms auf mehrere externe Libraries.
Eine Library kann enthalten:
- Variablen
- Stringvariablen
- Arrays
- Subroutinen
- exportierte Subroutinen
Eine Library wird mit import eingebunden. Ihre von außen verfügbaren Bestandteile werden über den Namespace der Library angesprochen.
| import test1 n=test1.test1() |
Dabei ist test1 der Namespace und test1() die exportierte Subroutine.
2. Libraries und Namespaces
Eine oder mehrere Libraries können importiert werden:
| import test1 import test2 import test3 |
Jede Library besitzt ihren eigenen Namespace. Dadurch können gleichnamige Variablen und Subroutinen verschiedener Libraries eindeutig unterschieden werden.
| a=test1.value b=test2.value n=test1.test() m=test2.test() |
Der Namespace wird beim Zugriff vor den Namen des gewünschten Bestandteils gesetzt:
namespace.sub() namespace.sub$() namespace.variable namespace.variable$3. Exportierte Subroutinen und Rückgabewerte
Eine Subroutine, die außerhalb ihrer Library aufgerufen werden soll, wird mit export definiert:
|
export sub test1()
return 10
end sub
|
Der Aufruf erfolgt über den Namespace:
| n=test1.test1() |
Auch Subroutinen mit $ können exportiert werden:
|
export sub test2$()
return "Hallo"
end sub
|
Aufruf:
text$=test2.test2$()Das $ ist Bestandteil des Namens der Subroutine und muss beim Aufruf entsprechend angegeben werden.
Eine mit $ benannte Subroutine kann dabei auch einen numerischen Wert zurückgeben. Das $ bestimmt also nicht zwingend den Datentyp des return-Wertes.
Rückgabewerte können direkt zugewiesen oder unmittelbar weiterverarbeitet werden:
n=test.get_number() text$=test.get_text$() print arraydim(test.get_array())4. Parameterübergabe
Exportierte Subroutinen können einen oder mehrere Parameter erhalten.
export sub add(zahl) return zahl*2 end subAufruf:
n=test.add(10)Mehrere Parameter:
export sub add(zahl1,zahl2) return zahl1+zahl2 end subAufruf:
n=test.add(10,20)Die Reihenfolge der übergebenen Werte entspricht der Reihenfolge der Parameterdefinition.
Dabei können auch unterschiedliche Werte übergeben werden:
export sub text$(text$,zahl) return text$+str$(zahl) end subAufruf:
text$=test.text$("Wert: ",10)5. Zugriff auf Variablen
Variablen einer Library können über den Namespace angesprochen werden.
Numerische Variable:
n=test1.bStringvariable:
text$=test1.d$Allgemeine Formen:
namespace.variable namespace.variable$Damit kann eine Library neben ihren exportierten Subroutinen auch Daten für andere Programmteile bereitstellen.
6. local-Variablen
Eine mit local deklarierte Variable gehört zur jeweiligen Subroutine.
counter=100 export sub test() local counter counter=counter+1 return counter end subHier existieren zwei unterschiedliche Variablen:
counter? Library-Variable
und:
local counter? lokale Variable der Subroutine.
Der Zugriff:
test.counterbezieht sich auf die Library-Variable und nicht auf die lokale Variable.
Die lokale Variable wird bei jedem erneuten Aufruf der Subroutine neu initialisiert.
Beispiel:
export sub test() local counter counter=counter+1 return counter end subMehrere Aufrufe liefern:
test() ? 1 test() ? 1 test() ? 1Eine local-Variable einer anderen Subroutine ist ebenfalls unabhängig, auch wenn sie denselben Namen besitzt.
7. Zugriff einer Library auf andere Libraries
Eine Library kann auf exportierte Subroutinen und Variablen anderer Libraries zugreifen.
Beispiel:
export sub test5() a=test1.test1() b$=test2.test2$() return a end subEbenso kann auf Variablen zugegriffen werden:
n=test1.b text$=test2.d$Dadurch können Libraries untereinander sowohl Funktionen als auch Daten verwenden.
Eine Library kann somit beispielsweise:
a=test1.test1() b=test1.bverwenden.
8. Cross-Namespace-Aufrufe
Mehrere Libraries können miteinander kombiniert werden.
Beispielsweise:
main.yab ¦ +-- test1 +-- test2 +-- test5test5 kann Funktionen und Variablen von test1 und test2 verwenden:
export sub test5() a=test1.test1() b$=test2.test2$() return a end subDamit können größere Programme aus mehreren spezialisierten Libraries aufgebaut werden.
Eine Library kann dabei sowohl auf Subroutinen:
test1.test1()als auch auf Variablen:
test1.banderer Namespaces zugreifen.
9. Arrays
Libraries können Arrays enthalten und Arrays über exportierte Subroutinen zurückgeben.
Beispiel:
dim numbers(3) numbers(1)=10 numbers(2)=20 numbers(3)=30Eine exportierte Subroutine kann das Array zurückgeben:
export sub test_numbers() return numbers end subDer Rückgabewert kann über den Namespace direkt weiterverarbeitet werden:
print arraydim(test_array.test_numbers()) print arraysize(test_array.test_numbers(),1)Das gleiche gilt für String-Arrays:
print arraydim(test_array.test_id$()) print arraysize(test_array.test_id$(),2)Damit können numerische und String-Arrays über Namespace-Subroutinen zurückgegeben und direkt an Array-Funktionen übergeben werden, ohne sie vorher zwingend einer Variablen zuweisen zu müssen.
Beispielsweise:
arraydim(test_array.test_numbers())führt zunächst die Namespace-Subroutine aus und übergibt deren Array-Rückgabewert anschließend an arraydim().
Ebenso:
arraysize(test_array.test_numbers(),1)oder:
arraydim(test_array.test_id$()) arraysize(test_array.test_id$(),2)Damit eignet sich der Namespace auch für den Austausch komplexerer Datenstrukturen zwischen Libraries.
10. Variablen und Subroutinen als gemeinsamer Namespace
Eine Library stellt über ihren Namespace unterschiedliche Bestandteile zur Verfügung.
Beispiel:
test1 ¦ +-- test1() +-- value +-- text$ +-- ArrayDiese können über denselben Namespace angesprochen werden:
n=test1.test1() n=test1.value text$=test1.text$ print arraydim(test1.get_array())Der Namespace dient somit als gemeinsamer Namensraum für die von der Library bereitgestellten Subroutinen und Variablen.
11. Bestätigte Eigenschaften
Die Namespace-Funktionalität wurde anhand einer Testreihe mit insgesamt 16 Tests überprüft.
Dabei wurden folgende Bereiche getestet:
- Import mehrerer Libraries
- Namespace-Aufrufe
- exportierte Subroutinen
- Subroutinen mit und ohne $
- numerische Rückgabewerte
- String-Rückgabewerte
- Parameterübergabe
- mehrere Parameter
- unterschiedliche Parameter
- Zugriff auf Variablen über den Namespace
- Zugriff einer Library auf andere Libraries
- Kombination aus Subroutinen und Variablen verschiedener Namespaces
- Arrays als Rückgabewerte
- numerische Arrays
- String-Arrays
- direkte Übergabe von Array-Rückgabewerten an arraydim()
- direkte Übergabe von Array-Rückgabewerten an arraysize()
- Verhalten von local-Variablen
Insbesondere wurde bestätigt, dass ein Array-Rückgabewert direkt weiterverarbeitet werden kann:
arraydim(test_array.test_numbers()) arraysize(test_array.test_numbers(),1) arraydim(test_array.test_id$()) arraysize(test_array.test_id$(),2)12. Kurzreferenz
| Funktion | Syntax |
|---|---|
| Library importieren | import name |
| Sub exportieren | export sub name() |
| $-Sub exportieren | export sub name$() |
| Sub aufrufen | name.sub() |
| $-Sub aufrufen | name.sub$() |
| Variable | name.variable |
| Stringvariable | name.variable$ |
| Ein Parameter | name.sub(wert) |
| Mehrere Parameter | name.sub(wert1,wert2) |
| Rückgabewert | return wert |
| Array zurückgeben | return array |
| Arraydimension | arraydim(name.sub()) |
| Arraygröße | arraysize(name.sub(),dimension) |
| Library-Variable | name.variable |
| Library-Stringvariable | name.variable$ |
13. Merksatz
import bindet eine Library ein, export stellt eine Subroutine nach außen bereit und der Namespace ermöglicht den eindeutigen Zugriff auf die Variablen und Subroutinen der Library.
import meine_lib n=meine_lib.berechnen(10) text$=meine_lib.text$("Hallo") wert=meine_lib.variable text$=meine_lib.text$ print arraydim(meine_lib.get_array())Damit können YAB-Programme in mehrere Libraries aufgeteilt und diese Libraries über Namespaces miteinander verbunden werden.