BlitzMax Extended

Kommentare anzeigen Worklog abonnieren
Gehe zu Seite 1, 2  Weiter

Worklogs BlitzMax Extended

Der String war's

Montag, 8. Oktober 2012 von ProfJake
Jop, jop, jop.

Der Fehler hat wurde gestellt und standesgerecht ersch.. beseitigt : )
Es lag wohl am Code in bbStringFind, den ich etwas unglücklich verschlimmbessert hatte.
An dieser Stelle auch einen Dank an blackgecko, obwohl ich mir nicht sicher bin, wie das
bei ihm vorher schon so problemlos durchlief – schwarze Magie wahrscheinlich.

Ich hab jetzt auch gar nicht so unglaublich Zeit, deshalb jetzt nur schnell der Link und weiter geht's.
Beim nächsten Mal werde ich wohl genauer auf ein paar praktische Neuerungen im Bereich der Arrays
eingehen. Wer Muße hat, kann sich ja mal die Funktionen toCArray, FromCArray und filterInt
anschauen. Speziell bei den Filterfunktionen könnte es aber noch Änderungen geben,
da ich noch am grübeln bin, ob ich das Array mit als Parameter übergebe oder nicht.

Anyways.

Download (Source)


Stay caffeinated,
ProfJake

EDIT: HOT-FIX gegen Probleme mit inline und restrict

Kurz und kaputt

Sonntag, 7. Oktober 2012 von ProfJake
Schönen Sonntag euch allen,

hier gibt's die neueste Portion BlitzMaxExtended. Obwohl ich einige schwerwiegende Fehler finden
und beheben konnte, treibt sich aber immernoch ein besonders nerviger im Quelltext rum.

Mir ist er erst aufgefallen als ich makedocs kompilieren wollte um eine Änderung im
bekanntermaßen nicht ganz so schönen Dokumentations-HTML einzubauen. Daraufhin kamen ein
paar Fehler auf, die zum Glück (?) das Programm mit einer netten Fehlermeldung abstürzen
ließen. Diesen Gefallen hat mir der noch nicht beseitigte nicht getan.


Macht mal was kaputt
Wie ihr helfen könntet, so ihr denn gewillt seid.

Es wäre praktisch, wenn ihr auch mal versuchen könntet makedocs zu kompilieren und auszuführen.
Bei mir schafft er mal mehr mal weniger Module und stürzt dann mittendrin einfach ab.
Sang und klanglos.

Meine Hoffnung ist jetzt, dass eure Systeme vielleicht musikalischer sind und in ihrem Abgesang
noch eine hilfreiche Information ausspucken. Daran wäre ich dezent interessiert, wie man sich sicher
denken kann.


Download (Source)


Das war's auch schon wieder für heute.


Stay caffeinated,
ProfJake

Lahmarschig, aber am Leben

Sonntag, 30. September 2012 von ProfJake
Hi Jungs,

inzwischen bin ich umgezogen und hab mich ein wenig in der Realität vergnügt, aber meine Hass-Liebe
sitzt anscheinend tiefer als gedacht. Von daher gibt's nun mal wieder ein kleines Update,
welches eigentlich nur die Dokumentation ein wenig aufräumt sowie einige Rechtschreibfehler behebt.

Mehr ein Lebenszeichen als ein Meilenstein also : )


Download (Source)


Stay caffeinated,
Fabian

Pinguin: Check!

Dienstag, 17. Juli 2012 von ProfJake
Hi folks,

bei der Linux-Version gab es ja noch kleinere Schwierigkeiten – soll heißen nix ging – die jetzt der Vergangenheit angehören.
Getestet wurde es unter Mint und Debian. An dieser Stelle speziellen Dank an Thunder, der einer von zwei Lesern ist, die mal
eine Rückmeldung gegeben und auf ein Problem hingewiesen haben. Problem gelöst, das hat er nun davon.

Download (Source)

Jetzt fehlt nur noch eine Wortmeldung der Fenster-und-Sanduhr-Fraktion. Ein einfaches true (läuft) oder false (Blut, Morde und Festplatten-Moshpit)
in der Kommentarabteilung würde schon reichen, um mich ruhig schlafen zu lassen.


Stay caffeinated,
Fabian


EDIT: HOT-FIX für Windows – der Zweite.

Husch, husch

Mittwoch, 11. Juli 2012 von ProfJake
Hi, heute mal ganz kurz.

Mir ist aufgefallen, dass die neuen Funktionen nur in C dokumentiert sind, blöd.
Hier also eine erste Dokumentation in BlitzMax. Zusammenfassung:

  • Buf-fixes in blitz_array.c
  • neue Funktionen bbArrayFind und bbArrayContains
  • minimale BlitzMax Dokumentation
  • C-Dokumentation verbessert (aus bbdoc aufrufbar)


Download (Source)


EDIT

Die früher schonmal erwähnten Klassen (Interfaces) IEnumerator und IEnumerable sind jetzt
auch mit dokumentiert worden. Sie sind einfach eine Deklaration der schon eingebauten
Funktionalität um Klassen mit ForEach zu nutzen (z.B TList).

BlitzMax: [AUSKLAPPEN]
Type IEnumerator Abstract
Method hasNext:Int() Abstract
Method nextObject:Object() Abstract
End Type

Type IEnumerable Abstract
Method objectEnumerator:IEnumerator() Abstract
End Type


Sie haben zwar keine eigene Funktionalität (= Interface), aber ich finde das ist sauberer als zu sagen:
"Um mit ForEach kompatibel zu sein musst du deine Methoden so und so nennen. Durch Magie klappt das
dann und die Namen kannst du dir gefälligst aus dem Quelltext oder irgendwo aus der Hilfe raussuchen."



Stay caffeinated,
Fabian

Alpha aka Die Vorschauversion

Samstag, 7. Juli 2012 von ProfJake
Hola, Compadres!

Bei uns in der Region kommt gerade die halbe Ostsee vom Himmel geregnet. Da dachte ich mir wenn dass bei
euch so ähnlich ist, habt ihr bestimmt total viel Lust darauf mal einen ersten Blick auf die Alpha-Version zu werfen.

Der Deal ist folgender: Ihr könnt damit machen was ihr wollt, aber ich würde wirklich gerne eure Meinung dazu hören.
Und mit Meinung meine ich speziell Fehlermeldungen. Mein System ist ein MacOS X 10.6.8 und hier scheint alles zu laufen.
Getestet habe ich größtenteils mit den beigelegten samples von BlitzMax sowie MiniB3D.


Download (Source)


Zur Installation ganz einfach den originalen brl.blitz Ordner durch diesen ersetzen (vorher Sicherheitskopie).

Schönes Wochenende,
Fabian

EDIT: Aktualisierte Version 0.8.10 (Fix) verlinkt.

Schon wieder kein Download, meh.

Samstag, 30. Juni 2012 von ProfJake
Hi there,

und "high" sehe ich bestimmt auch gerade aus, nach der Nacht und der 3. Badewanne voll C8H10N4O2. [/bad-joke]


Reflection
Ins Innere von BlitzMax schauen.


Reflection in BlitzMax setzt einen korrekt befüllten BBDebugScope vorraus. Normalerweise erledigt das
der Kompiler, indem er alles dafür notwendige aus dem Quelltext ausliest. Das ist mir natürlich alles viel
zu komfortabel, weshalb ich – nachdem die C Implementierung fertig war – mir schon gut 'nen halben
Zahn daran ausgebissen habe, den ganzen Spaß zum Laufen zu bekommen.

Problem? aka "U MAD, BRO?"

Erstmal blitz_debug.h und den Assembler-Output vom bcc überflogen und festgestellt: Easy!
Doch wie so oft .. ihr wisst schon: Teufel, Detail, Blut & Morde! Irgendwie hab ich das Problem immer weiter
nach hinten geschoben. Denn "theoretisch" hätte es funktionieren müssen, was es aber natürlich nicht tat.

Um die folgenden zwei Bösewichter geht's:

Code: [AUSKLAPPEN]
struct BBDebugDecl
{
   BBDebugDeclKind      kind;
   const char         *name;
   const char         *type_tag;
   
   union {
      BBString*      const_value;
      BBSize         local_offset;
      BBSize         field_offset;
      void         *global_address;
   };
};

struct BBDebugScope
{
   BBDebugScopeKind   kind;
   const char         *name;
   BBDebugDecl         decls[1]; // Problem
};


Das Problem war erst, das decls Feld des DebugScopes richtig zu füllen, worum sich der gute Herr
Sibly ja in seinem C-Code gedrückt hat. Sein Kompiler wird das Geheimnis mit ins Grab nehmen *MUHAHA* ..
.. nicht, natürlich. Ist ja alles sehr simpel aufgebaut. Lösung folgt.


Solution? aka "Thanks, CAPT. OBVIOUS!"

Die meiste Zeit habe ich damit verbracht, ganz klassisch an der falschen Stelle zu suchen. Die neue Helferfunktion
bb_class_register_multiple sollte einfach das Registrieren mehrerer Klassen beschleunigen, aber durch
einen Geniestreich ohnegleichen habe ich nur den ersten Wert der va_list registriert.

Soll heißen, die neue Funktion für mehrere Klassen gleichzeitig registriert doch nur eine.

user posted image



Wenn man sich dann auf sein neues Spielzeug verlässt und alle anderen Code-Teile wüst beschimpft, dann
kann das schon etwas dauern, bis man die Lösung findet. Nun gut, jetzt läuft es ja.

Das das decls Feld betreffende Problem habe ich durch ein bisschen schummeln gelöst.
Es gibt jetzt einen internes struct bb_debugscope_t, wo genau dieses Feld als decls[]
anstatt decls[1] deklariert ist. Wird wahrscheinlich den wenigsten etwas sagen, daher ein Beispiel:


TBaseException

Basis-Exception-Klasse für alle BlitzMax internen Exceptions und auch für eure eigenen.
Der Name TBaseException rührt daher, dass TException in den Aufgabenbereich der BSL gehört.
Es ist wirklich nur die minimale Funktionalität, später mehr dazu. Hier sieht man, wie die Klasse in BlitzMax aussehen
würde, wäre sie denn auch darin implementiert. Für die Anwender kommt das aber auf's Gleiche raus.

BlitzMax: [AUSKLAPPEN]
Type TBaseException Abstract
' Private: Nur für C/C++
Field cause:TBaseException

Method initCause(cause:TBaseException)
If Not Self.cause And cause <> Self Then
Self.cause = cause
End If
End Method

Method getCause:TBaseException() Final
Return Self.cause
End Method
End Type



Da C viel zu cool ist, um sich um BlitzMax zu kümmern, findet man die Klasse in blitz_exception.h / .c
als BBException mit dazugehöriger bbExceptionClass.

Der vielbesungene BBDebugScope sieht intern so aus:

Code: [AUSKLAPPEN]
// blitz_exception.c
static const bb_debugscope_t ClassScope =
{
   .kind   = BBDEBUGSCOPE_USERTYPE,
   .name   = "TBaseException",
   .decls   = {
      [0] = {
         BBDEBUGDECL_TYPEMETHOD,
         "initCause", "(:TBaseException)i",
         BBCLASS_VFN_OFFSETOF(__BBEXCEPTION_VFN_INITCAUSE__)
      },
      [1] = {
         BBDEBUGDECL_TYPEMETHOD,
         "getCause", "():TBaseException",
         BBCLASS_VFN_OFFSETOF(__BBEXCEPTION_VFN_GETCAUSE__)
      },
      BBDEBUGDECL_END
   }
};



Alles hier definierte wird dann von allen abgeleiteten Klassen übernommen, muss also nicht nochmal geschrieben
werden und Platz wegnehmen.

Hier sieht man nebenbei auch schön einige der internen Features, dass Makro BBCLASS_VFN_OFFSETOF z.B. gibt hier
den Offset der virtuellen Funktion (Method oder Function einer Klasse) für den übergebenen Index zurück.


Arrays und Alpha
Was sonst noch so passiert

Wie man merkt, schreib ich gerade nicht mehr ganz geradeaus. Deshalb nur so viel: Es gibt noch 'ne Menge zu tun.
Einiges wird sich ändern, aufgeräumt muss noch werden und die Dokumentation muss ich nochmal "glattbügeln".

Die Arrays sind wieder ein bisschen gewachsen: um einen Parameter und eine Methode.


Find*

Neuer Parameter für alte, neue Methode. Nutzt jetzt intern z.B das BBIntArray Helfer-Object
und unterstützt nur noch Arrays des gleichen Typs (=schneller).

BlitzMax: [AUSKLAPPEN]
Array.findInt:Int(num:Int, start_index:Int = 0)


StartsWith & EndsWith

Funktionieren genau wie bei Strings, das zu testende Array muss gleichen Typs wie das aufrufende sein.

BlitzMax: [AUSKLAPPEN]
Array.startsWith:Int(other:Array)
Array.endsWith:Int(other:Array)


Dies ermöglicht recht eleganten Quelltext zu schreiben, z.B

BlitzMax: [AUSKLAPPEN]
If arr.startsWith([1, 2, 3]) Then [...]




So, fertig.


Fragen, Anregungen und Goldbarren sind jederzeit willkommen.
(Goldbarren nur Werktags zwischen 8 und 18 Uhr.)


Stay caffeinated,
Fabian

Ich kam, debugte und siegte!

Freitag, 29. Juni 2012 von ProfJake
Guten Abend die Damen und Herren,

nachdem ich das zweifelhafte Vergnügen hatte den ganzen Tag einem Bug hinterherzujagen,
dachte ich etwas Erholung könnte nicht schaden. Daher habe ich noch ein bisschen Features reingepackt.

Schon lustig, aber neue Funktionen schreiben macht ungleich viel mehr Spaß als der ganze andere
Aufräum- und Dokumentationskrams. Aber das habe ich mir ja wohl selbst zuzuschreiben.


String

Hier hat sich ein kleines Problem ergeben, da ich die Anzahl der virtuellen Funktionen einer BBClass
mittlerweile komplett gefüllt habe. Vor Urzeiten hatte ich mal getestet, ob BlitzMax selbst so ein Limit (32)
hat und ich glaube nicht. Irgendwie muss das also gehen. Aber bis jetzt ging's ja auch mit dem was da war
ganz gut, von daher hat das keine Priorität.


FindAny

Durchsucht einen String nach dem ersten Vorkommen eines beliebigen Strings aus dem Such-Array.

Passt keiner der gegebenen Such-Strings so recht, dann wird String.NOT_FOUND zurückgegeben.
BlitzMax: [AUSKLAPPEN]
String.FindAny:Int(all_subs:String[], start_index:Int = 0)



IsLower/IsUpper

Prüft ob der String komplett klein/groß geschrieben ist.
BlitzMax: [AUSKLAPPEN]
String.isLower:Int()
String.isUpper:Int()


Das ist viel schneller als z.B
BlitzMax: [AUSKLAPPEN]
If str = str.toLower() Then [...]

Denn hier muss keine neue Stringinstanz erzeugt werden


IsASCII

Eher ein Gimmick was rausfliegen wird, wenn ich keinen anderen Weg finde z.B. pad reinzubekommen.

Prüft ob alle Buchstaben durch den ASCII-Code repräsentiert werden können (keine Code Points über 127).
BlitzMax: [AUSKLAPPEN]
String.isASCII:Int()



Array

Ja, auch der Bug-Verursacher und Schlaf-Räuber des heutigen Tages kriegt ein kleines Geschenkchen.

Rotate

Rotiert die Elemente eines Arrays um eine gewisse Anzahl an Positionen.
Gibt das rotierte Array zurück. Wenn die Anzahl der Rotationen kleiner als 2 ist,
wird das Original unverändert zurückgegeben.

BlitzMax: [AUSKLAPPEN]
Array.rotate:Array(count:Int = 1)


Beispiel

BlitzMax: [AUSKLAPPEN]
Local arr:Int[] = [1,2,3,4,5].rotate(1)

Print arr[0] + ", " + arr[1] + ", " + arr[2] + ", " + arr[3] + ", " + arr[4]
' Output: 5, 1, 2, 3, 4



Und sonst so?
Was dem Backend so zugestoßen ist ..

Wie schon gesagt wurde viel rausgehauen (z.B StringBuffer, Iteratoren, Exception-Hierarchien)
weil brl.blitz nicht optional ist und ALLE DAS BENUTZEN MÜSSEN. Weil .. deshalb.

Nein, Spaß beiseite: Es geht natürlich um Modulgröße, Kompatibilität und Einfachheit.
Sollte die BSL in diesem Leben nochmal fertig werden, wird's ein Monster. Aber das hier
eben nicht. Trotzdem hat sich einiges geändert:

  • neue TBaseException Klasse von der alle abgeleitet werden (auch TBlitzException)
  • TArrayBoundsException, TNullObjectException, TNullMethodException, TNullFunctionException und TOutOfDataException sind jetzt Final
  • alles ist in C implementiert (auch die gerade genannten Exceptions)
  • IEnumerator und IEnumerable Interfaces (tun nix, sind aber schick Very Happy )



Jo.

Stay caffeinated,
Fabian

Ausmistungsunternehmung

Mittwoch, 27. Juni 2012 von ProfJake
"Weniger ist mehr." – Vielzitierter Klugscheißer

Entgegen der gerade genannten Weisheit habe ich, als ich meinen Blick heute Nacht mal wieder
über das Projekt habe schweifen lassen, festgestellt, dass ich zu viel Funktionalität reingestopft habe.
Funktionalität, die eigentlich besser in der BSL (da war doch was) aufgehoben wäre.
Also ging es erst einmal an's Aufräumen und Rausschmeißen.

Das war soweit auch schon alles, ich wollte nur zu Protokoll geben, dass das Projekt noch lebt.
Es läuft auch fleißig und ich denke, beim nächsten Mal werde ich zumindest eine Alpha raushauen.
Dann können die zwei Personen, die das hier mitlesen ("Höre ich drei? Wer bietet drei?") mal schauen können,
was dabei alles kaputt geht : p


Stay caffeinated,

Fabian

Ein paar Neue

Donnerstag, 17. Mai 2012 von ProfJake
Wie beim letzten Mal versprochen, gibt's jetzt erstmal eine kurze Auflistung einiger neuer Sachen.

String

Die Stringklasse wurde größtenteils unter der Haube aufgehübscht, aber es gibt natürlich auch auf
Seiten von BlitzMax einige Neuerungen.


Trim

Der altbekannte Leerzeichenabschneider hat jetzt einen Parameter, der festlegt auf welcher Seite
die unerwünschten Zeichen abgetrennt werden sollen.

Es gibt die logischen drei Optionen: String.SIDE_LEFT, String.SIDE_RIGHT und String.SIDE_BOTH
Zur Zeit verhält sich die Methode so, als ob immer SIDE_BOTH übergeben würde.

BlitzMax: [AUSKLAPPEN]
String.Trim(side:Int = String.SIDE_BOTH)


FindAll

Will man alle gefundenen Substrings aus einem String herauskitzeln, so muss man jetzt keine
eigene Funktion mehr schreiben.

Es wird ein eindimensionales Int[] Array mit allen Indexes zurückgegeben, oder eben Null wenn
gar nichts gefunden wurde.

BlitzMax: [AUSKLAPPEN]
String.findAll:Int[](sub:String, start_index:Int = 0)



Count

Zählt alle enthaltenen Teilstrings. Ganz einfach.

BlitzMax: [AUSKLAPPEN]
String.count(sub:String)



Reverse

Noch so ein alter Bekannter aus der BSL. Diese Methode dreht quasi den String
komplett Zeichen für Zeichen um.

BlitzMax: [AUSKLAPPEN]
String.reverse:String()



Times

Gibt einen String mehrfach wiederholt zurück. Beim Parameterwert 1 gibt's den übergebenen
String einfach wieder. Wenn man dagegen 0 übergibt, bekommt man auch Null zurück : )

BlitzMax: [AUSKLAPPEN]
String.times:String(count:Int)



Sub

Eine alternative Möglichkeit einen Teilstring zu erhalten. Im Gegensatz zu den Slices nimmt er
aber nicht zwei Indexes und gibt alles dazwischen zurück, sondern es wird aus einem Startindex
und der Länge des Substrings berechnet.

Ist die resultierende Länge zu groß, wird alles bis zum Ende des originalen Strings zurückgegeben.
Bei negativem Startindex, wird von hinten angefangen zu zählen, so dass man die Methode sehr
vielfältig einsetzen kann.

BlitzMax: [AUSKLAPPEN]
String.sub:String(start_index:Int, length:Int)



Clone

Gibt eine neue Instanz des Strings zurück. Gleicher Inhalt in neuem String quasi. Das ist für Strings
nur bedingt sinnvoll, aber ich habe diktatorisch festgelegt, dass eine der sinnlos herumgammelnden
reservierten Methoden von BBClass ab jetzt eine Clone Method ist.

BlitzMax: [AUSKLAPPEN]
String.clone:String()



Object

Besagte Clone-Methoden-Kur wurde natürlich auch dem Basisobjekt verpasst. Es enthält jetzt eine
generische Methode, die von den im BBDebugScope gespeicherten Werten (siehe letzter Worklog)
ausgehend alle möglichen Objekte klonen kann.

Ich bin noch am überlegen, ob da nicht vielleicht eine abstrakte Platzhaltermethode sinnvoller wäre,
die einen Fehler ausgibt. Aber wenn man alles klonen kann und dass auch noch viel schneller als über
Reflection, warum dann nicht gleich implementieren?

BlitzMax: [AUSKLAPPEN]
Object.clone:Object()



Arrays

Die guten alten Speicherknechte sind ja relativ leer ausgegangen als es um die Bestückung mit
Werkzeug aka Methoden ging. Viel habe ich da auch noch nicht gemacht, aber das wird noch.

ToString

Ja gut, ToString kennt jeder. Leider ist das standardmäßig so unglaublich unnütz, dass es weh tut.
Es gibt die Speicheraddresse eines Objekes aus. Aha. Hab ich ehrlich gesagt noch nie gebraucht.

Ab sofort spuckt ein Aufruf oben genannter Methode eine kurze Beschreibung des Arrays aus:

BlitzMax: [AUSKLAPPEN]
Local arr1:Int[] = [1, 2, 3, 4, 5]
Print arr1.toString() ' Ausgabe: (Array) Int[5]

Local arr2:Float[1,2,3,4,5]
Print arr2.toString() ' Ausgabe: (Array) Float[1,2,3,4,5]


Find*

Arrays zu durchsuchen ist ja keine ungewöhnliche Aufgabe, aber durch die fehlende Funktionsüberladung
in BlitzMax steht es schlecht um die datentyp-neutrale Suchwertübergabe. Ich hab das Ganze natürlich sehr
elegant *hust* gelöst.

Es haben einfach alle Datentypen ihre eigene Suchmethode. Beispiel gefällig?

BlitzMax: [AUSKLAPPEN]
Array.findInt:Int(value:Int)


Das findet den Index, des ersten Feldes mit dem übergebenen Wert. Ich werde mal schauen, ob ich noch
mehr hinzufüge (FindLast, Replace, Reverse) aber ich denke das würde Sinn ergeben.


Stay caffeinated,
Fabian

Gehe zu Seite 1, 2  Weiter