Bibliotheken - Object erstellen

Implementiert ab Version2015.r1

Eine Objekt-Bibliothek ist eine instanzierbare Klasse in Form einer Bibliothek. Sie fügt einen neuen Objekt-Datentyp hinzu, welcher erzeugt/instanziert werden muss, bevor man ihn verwenden kann. Der in Luna fest eingebaute Typ „MemoryBlock“ ist z.B. ein solcher Objekt-Datentyp. „String“ ist ebenfalls ein Objekt-Datentyp, der vom Objekt „MemoryBlock“ abgeleitet ist.

Das Library-Objekt kann je nach Gestaltung wie z.B. auch ein MemoryBlock entsprechende Funktionen zur Verfügung stellen, die auf das Objekt angewendet werden können. Jedes Objekt besitzt nach dem Erzeugen seinen eigenen, lokalen dynamischen Speicher. Objekte können demnach mehrfach zur gleichen Zeit im Speicher existieren. Die Anzahl der möglichen parallelen Instanzen ist nur duch den Arbeitsspeicher begrenzt.

Ein Objekt wird in einem MemoryBlock gespeichert, daher belegt es bis auf die eigentliche Variable keinen Speicherplatz solange es nicht erzeugt/initialisiert wurde. Es kann während der Programmlaufzeit also konstruiert und zerstört werden.

Das vormals fest eingebaute Objekt „Graphics“ wurde in ein Library-Objekt ausgelagert. Es dient auch als Beispiel für eigene Implementationen. Weiterhin finden sie im Ordner /Library/Example/ die Bibliothek xstring.object, welche einen eigenes String-Objekt zur Verfügung stellt.

Im Gegensatz zu einem Interface oder Modul, kann in einem Objekt keine verschachtelte Syntax mit Schlüsselwörtern definiert werden. Die Syntax ergibt sich aus der Funktionalität des Objekts und der möglicherweise zusätzlich implementierten weiteren Objekte und deren Funktionen.

In einem Library-Objekt gibt es nur eine Basisebene in welcher sich die eigentlichen Funktionen (Methoden) befinden, die der Luna-Programmierer nutzen kann.

Im Verzeichnis Konstruktoren befinden sich die notwendigen Objekt-Handler (Basisfunktionen) die jedes Objekt aufweisen muss, damit der Compiler das Objekt erzeugen, zerstören, zuweisen oder in Ausdrücke einbetten kann.

Für die Nutzung des Objekts in Ausdrücken mit Operatoren - z.B. „+“, „-“, „and“, wird die Funktionalität „Operator-Überladen“ unterstützt. D.h. es ist optional möglich Handler (Basisfunktionen) für Operatoren zu erstellen, sodass man z.B. mit zwei verschiedenen Objekten eine Addition o.Ä. durchführen kann.

#library "Library/Graphics.object"
'[...]
dim g as Graphics
 
g = new Graphics(64,32)
if g<>nil then
  g.Font=font.Addr		'set font
  g.Text("Hello",1,1)
end if
 
'[...]
 
#includeData font,"fonts\vdi6x8.lf"

Siehe hierzu Beispiel-Bibliothek xstring.object im Ordner /Library/Example/ . Die Beispiel-Bibliothek ist mit entsprechenden Beschreibungen ausgestattet. Beim Anlegen z.B. einer Methode oder eines Konstruktors ist automatisch eine Kurzerklärung vorhanden.

Code-Beispiel:
xstring-example.luna
#library "Library/Example/xstring.object"
 
avr.device = atmega328p
avr.clock = 20000000
avr.stack = 96
 
uart.baud = 19200			' Baudrate
uart.recv.enable			' Senden aktivieren
uart.send.enable			' Empfangen aktivieren
 
dim value as word
dim a,b,r as xstring
 
print 12
wait 1
 
a = new xstring("This is")
b = new xstring(" just ")
 
'the address of the objects data blocks (memoryblock) 
print "a.Ptr = 0x";hex(a.Ptr)
print "b.Ptr = 0x";hex(b.Ptr)
 
'the content of the objects
print "a = ";34;a;34
print "b = ";34;b;34
 
r = a + b + "amazing!"
 
print "r.Ptr = 0x";hex(r.Ptr)
print "r = ";34;r;34
 
'calling a function of the object
print "r.reverse = ";34;r.reverse;34
 
'calling a function who returns a object
print "return value of function 'test()' = ";34;test();34
 
'destroy a object
r = nil
 
 
halt()
 
'object as return value
function test() as xstring
  return new xstring("test")
endfunc