Simple Script Max

Kommentare anzeigen Worklog abonnieren
Gehe zu Seite Zurück  1, 2, 3, 4, 5, 6, 7, 8  Weiter

Worklogs Simple Script Max

Stress mit -> Operator

Samstag, 28. März 2009 von coolo
Hallo,
in letzter Zeit habe ich versucht, auch verschachtelte Feld/Methoden Zugriffe zu ermöglichen. Das funktioniert leider noch immer nicht, da es probleme mit dem Funktionsparser gibt. Das werde ich demnächst lösen. Außerdem wurde nun ermöglicht mehrere Instanzen von einem Objekt zu erstellen, und das erweitern dieser, da ja ein Objekt im Grunde genommen nur ein Assoziatives Array ist, ähnlich auch in Lua, wobei es da nicht direkt eine Klasse ist. Was ich damit meine:
Code: [AUSKLAPPEN]

local class1 as blubb
class1->new()
class1->x=10
mapadd(class1%,"irgendwas",100)
print (class1->x)
print (class1->irgendwas)
class1->update()

type blubb
   field x
   field y
   field other% AS Othertype
   method update()
        print("Hallo Welt")
   endmethod
endtype
Ausgabe:
10
100
Hallo Welt


Außerdem sieht man, dass es zurzeit nur ein Variablen Type gibt, nämlcih Strings, es wäre eine Leichtigkeit auch Ints/Floats einzubauen wobei ich da eure Meinung hören will, wie fändet ihr es wenn es nur Strings gäbe (Es gäbe keinen Einfluss auf die Geschwindigkeit Wink)?

Für die die das 'Self' nicht mögen habe ich nun auch das 'This' eingebunden, damit es nicht zu beschwerden kommt.

Nebenbei habe ich die IDE neu geschrieben, und somit ist das Syntax Highlighting viel schneller. Jetzt wird immer nur die aktuelle Zeile gehighlightet und alle 10 Sekunden die ganze, damit wenn man Copy/n/pastet die Zeilen nicht ungehighlightet bleiben!
Demnächst werde ich auch Tabber einbauen, und Funktionsnamen Erkennung 8Also das auch mit Function Deklarierte Funktionen gehiighlightet werden!)

Self dich doch selber!

Mittwoch, 25. März 2009 von coolo
Hallo,
wie man am Titel erkennen kann wurde heute das allseitsbeliebte Self, oder in manchen Sprachen als This bekannt eingebaut. Das lässt wiederrum schließen, dass auch Methoden zum Laufen gebracht wurden! Das war schwieriger als gedacht, da ja jetzt nicht mehr der Name direkt verwendet wird, sondern eine Bank Adresse in der das Assoziative Array ist, das heißt ich musste aus der Bank Adresse den Namen der Instanz herausfinden, um wiederrum herausfinden zu können wie der Klassenname lautet (Zur Erinnerung die Methoden werden als "Klassenname->Methodenname()" gespeichert).

Außerdem habe ich nun den Syntax verbessert! Er ist nun viel einfacher handzuhaben, und Handles können nun Local/Global sein!

Code: [AUSKLAPPEN]

local class1 as blubb
class1->new()

class1->x=10
print (class1->x)

class1->update()

type blubb
   field x
   field y
   method update()
        print("Hallo Welt")
        self->x=100
        print(self->x)
   endmethod
endtype

Ausgabe:
Code: [AUSKLAPPEN]

10
Hallo Welt
100

Sieht doch schon gut aus? Bei Anregungen/Tipps/Kritik bitte Kommentare ablassen.

OOP 2.0

Montag, 23. März 2009 von coolo
Hallöchen,
heute und gestern wurde die Objekt Orientierte Programmierung neu aufgesetzt. Es ist bereits möglich eigene Klassen zu erstellen, und diese dann zu benutzen. Zuerst der Code, und dann die Erklärung:
Code: [AUSKLAPPEN]


blubb("class1") ;Das wird noch geändert in local Class1 AS blubb : blubb->new()
class1->x=10
class1->update()
print (class1->x)


type blubb
   field x
   field y
   method update()
   print("Hallo Welt")
   endmethod
endtype

Wie man sieht ist im Moment der Syntax nicht der angenehmste. Ich gedenke das blubb("class1") mit der alten Form übersetzen.
Eine Klasse ist im Grunde genommen nur ein Assoziatives Arrays was vom Parser automatisch umgewandelt wird. Außerdem sieht man, dass man statt get() ein neuer Operator eingefügt wurde, nämlich das "->" , das erlaubt einen viel bequemeren Zugriff auf die Keys. Nebenbei habe ich versucht Methoden zu implementieren, wobei das noch nicht so klappt, da ja blöderweise Klammern vorrang haben, und somit der -> Operator gar nicht beachtet wird Sad...

Eine Klasse wird folgendermaßen umgewandelt:
Code: [AUSKLAPPEN]

function blubb(name$)
   local map%
   map%=mapcreate(name$)
   mapadd(map%,"x",0)
   mapadd(map%,"y",0)
   return(map%)
endfunction

function blubb->update()
   print("Hallo Welt")
endfunction

Und da sind Sie!

Samstag, 21. März 2009 von coolo
Hallo,
heute ist der Tag gekommen an dem nun endlich die assoziativen Arrays, oder wie es im Script heißt "map"s eingebaut. Die Befehle sind zurzeit sehr einfach, ich werde dies in Zukunft in eine leichtere Form vom Parser umwandeln lassen. Zurzeit ähneln sie von der Handhabung her ein bisschen Banks und Types. Wie heißt es so schön? Code sagt mehr als tausend Worte:
Code: [AUSKLAPPEN]

local map%
map%=map ()
add(map%,"keyone1",210)
add(map%,"keyone2",220)

set(map%,"keyone1",1)

print (get(map%,"keyone1"))
print (get(map%,"keyone2"))
;Ausgabe:
1
220


Ich gedenke statt get() einen neuen Operator einzubauen(->), dadurch sollte folgendes gehen:
Code: [AUSKLAPPEN]

print(map->keyone1) ;Und das schaut doch schon mehr nach OOP aus?


Und das Beste: map% ist in diesem Fall nur ein Bankhandle, das heißt ich kann das schon jetzt als Parameter weitergeben, und andere Dinge.

Die Assos kommen!

Freitag, 20. März 2009 von coolo
Hallo,
nun nach einiger Zeit des überlegen, wie ich Assoziative Arrays am besten einbauen könnte bin ich schließlich bei einer Hashmap gelandet. Der Vorteil an ihr ist, das sie sich in BB ziemlich leicht implementieren lässt, Banks eignensich dafür gut. IM Grunde genommen wartet es nur noch ans Einbauen in Simple Scipt Wink.

Für die Interresanten hier ist der Quellcode: https://www.blitzforum.de/uplo...?show=1417

Außerdem habe ich nun eine kleine aber feine Verbesserung eingebaut. Es wurde das von BlitzMax bekannte Superstrict in einer anderen Form eingebaut. In Simple Script 2 heißt es "mode" hat 2 Parameter und lässt sich für jede Funktion neu setzen.
NORMAL heißt ,Wie es bis jetzt war, NO_BRACKETS heißt kein Klammern zwang bei Funktionen ohne verwendeten Rückgabewert, NO_DECLARATION bedeutet das kein local mehr geschrieben werden muss. ein myvar%=0 reicht
Code: [AUSKLAPPEN]

mode (NO_BRACKETS,NO_DECLARATION)
myvar%=10
print "Hallo Welt" & myvar%

Schleifen und If Abfragen!

Montag, 16. März 2009 von coolo
Hallöchen,
nach einiger Zeit, melde ich mich wieder. Inzwischen ist einiges geschehen im Core von Simple Script 2. Unter anderem, habe ich nun das If Abfragen und Schleifen System KOMPLETT neu geschrieben. Außerdem wurde die Funktion parse_line() entschlackt und unnötige Parserteile entfernt (btw. Habe ich nun das OOP Modul rausgehauen, und mache in Zukunft ein neues).
Was wurde bei den beiden Systemen verändert/verbessert/verschlechtert? Nunja, zu allererst, wurden aus den If Abfragen einfach nur Gotos, welche eine Bedingung haben. Daraus wurde zwar die Parserzeit um ca. 7ms erhöht bei 100 Zeilen If Abfragen, wobei ich das Okay finde. Außerdem ist das ElseIf nun kein eigener Befehl mehr, sondern der Parser macht aus ihm eine weitere Abfraen Gruppe. Das wollte ich auch schon bei der Alten Version so bewerkstelligen, wobei es bei ihr eine Begrenzung von max. 100 gleichzeitig ausgeführten If Abfragen gab, und es da ziemlich schnell an seine Grenzen kam. Außerdem war die alte Method im Vergleich zur jetzigen eine Schnecke im Speed. Jetzt wird lediglich eine variable geändert, wenn eine If Abfrage Falsch ist.
Bei den Schleifen ist es nicht anders. Dort wird mommentan nicht mehr ein StepIn Verfahren verwendet, sondern die innerse Zuerst Regel. Das heißt, es wird immer die tiefst verschachtelte Schleifen Gruppe behandelt. Aus irgendeinem Grund funktionierte nämlcih die andere Variante nicht. While - Wend, Repeat - Until, repeat - forever Schleifen funktionieren bereits perfekt (auch verschachtelt), die For Schleifen funktionieren nur unverschachtelt.

Nebenbei wurde das Funktionssystem unter die Lupe genommen. Es wurden zwei neue und wichtige Dinge eingebaut!
Die erste wäre,dass das oft verwendete Funktionen ganz am Anfang in der Liste sind, und die selten verwendeten sind hinten in der Liste einreihen (Bei jedem aufruf, wird dir Funktion nach vorne gereiht). Dadurch Kann zeitweise ziemlich viel Speed kommen.
Die zweite wäre, das jetzt ein Kategorien System eingebaut wurde. Was bringt das? Aujedenfall bringt es sehr viel Ordnung und übersicht. Es gibt jetzt einen Oder mit dem Namen "Funktionen" Für jede Kategorie, gibt es dort eine Kategorie. Bilder sagen mehr als 1000 Worte(iwie kann man das schlecht erklären...):
user posted image

Das wars wieder mal mir (und das nächste Mal sind die Arrays dran...)

Assoziative Arrays wurden...

Montag, 9. März 2009 von coolo
...nicht eingebaut. Warum? Ich musste dafür die Code Basis komplett ändern, und da dachte ich mir, wenn ich die Code Basis ändere, dann richtig. Gesagt getan, und schon habe ich die Parser Funktion aufgeteilt, unwissend was das für Folgen hat. Welche Folgen hatte dies? Zum einen, funktionieren nun nurmehr die While und For Schleifen, die anderen sind nicht mehr in Funktion. Außerdem zicken die dummen Funktionen rum, wenn sie mehr als einen Parameter haben... Vomm OOP möchte ich garnicht erst reden, das hat seinen Geist völlig aufgegeben, wobei das nicht weiter schlimm ist, da ich einen neuen Ansatz für die Objekt Orientierte Programmierung gefunden habe. Wie sieht der bisherige Ansatz aus:
Bis jetzt hat jedes Objekt eine vordefinierte Anzahl an Variablen. Wenn also Local myimg AS Timage geschrieben wird, wurden darasu 3 Variablen und 2 Methoden: myimg.x%, myimg.y%,myimg.hndl% myimg.load(), myimg.draw(). Anfangs läuft das schon recht gut. Wobei wenn man kompliziertere Dinge wie Object Managemant (For Each...) Objekte als Parameter übergabe, etc. Wirds schon ein bisschen Komplizierter.
Meine Neuen Überlegungen sind Folgend: Im Grunde genommen, ist jedes Objekt, und dessen Instanz ein Feld in einem Assoziativen Array. Was heißt das? Das heißt, das Im Grunde genommen, wenn man myimg.x% aufruft, myimg["x%"] ausgeführt wird. Außerdem könne man durch handle("myimg"), Objekte als Parameter erlauben, da ja ein Array nur eine Bank Adresse ist. Mein Ziel in dieser Hinsicht ist, die Flexibilität wie in Bmax zu erreichen. Und eine Methode ist nichts anderes als eine Funktionsreferenz, wie die funktioniert wissen wir ja. Außerdem gedenke ich statt dem Punkt, den "->" Operator zu verwenden, was besser ist muss ich mir noch überlegen.

Ach, wo bin ich stehen geblieben? Ja, ich wollte die Code Basis vollkommen umwandeln. Dabei ist ein neuer Type rausgekommen: TPreScript. Was ist das und was macht das. Ein TPreScript ist im Grunde genommen ein unkompiliertes Script, dessen Zeilen man ohne weiters verändern, modifizieren kann. Mit einem einfachen scripthndl=Convert_PreScript(prescripthndl) wird ein normales Script erstellt.
Noch einmal kurz, welche Funktionen neu gekommen sind:
Code: [AUSKLAPPEN]

prescripthndl=Create_Prescript(name$) ;Erstellt ein PreScript
Load_file(prescripthndl,filename$) ;Lädt eine Datei in ein PreScript
Load_OnlineFile(prescripthndl,url$) ;Lädt ein Online File
Add_line(prescripthndl,line,content$) ;Fügt eine Zeile hinzu
Modify_line(prescripthndl,line,content$) ;Verändert eine Zeile
Get_line$(prescripthndl,line) ;Gibt den Inhalt der Zeile zurrück


Als nächstes baue ich die assoziativen Arrays ein, Versprochen Wink!

Es resized sich was!

Montag, 2. März 2009 von coolo
Hallo,
heute habe ich das Resizen für Array's eingebaut. Es ist doch nicht so einfach gewesen, dies einzubauen, bzw. nicht so schnell wie gedacht/gehofft, besonders bei Mehrdimensionalen Arrays. Jedoch ist der Geschwindigkeits Unterschied nicht so schlimm bei den Eindimensionalen Arrays, da hier eine geringere Menge an Offsets duchgegangen werden muss. Warum müssen die Offsets durchgegangen werden? Da BB bei einem neu dimensionieren einer Bank die neuen Einträge nicht mit eigenen Werten gefüttert werden, muss das von Hand geschehen, um Fehler zu vermeiden.

Außerdem wurde kurzfristig eingebaut, dass man Funktionen überladen kann, wobei man das nicht so wie in C++ sehen kann, sondern wie in BB, nur das als zusätzliches Kriterium, Die Parameter Anzahl hinzugenommen wird(leider gibt es ATM keine anderen kriterien [Richtige Variablen Typen bei Parametern gibt es nämlich nicht, sondern nur Strings{Nur bei internen Funktionen Wink}]) .

Außerdem werde ich mich an Assoziativen Arrays wagen, was ist das und wie funktioniert das? Grundsätzlich sind das ganz normale Array's, wobei der Index keine Zahl ist sondern ein Wort ist, wozu ist das nützlich? Ist ganz nützlich bei dem GUI Modul, einer Datenbank, oder dem Type System. Wozu dem Type System? Somit könnte man Types einen Namen geben, und ihn direkt mit diesem Namen ansprechen, dies wäre doch ein Mega Plus an Freiheit?

Bis denne

Hier könnte Ihre Werbung stehen!

Sonntag, 1. März 2009 von coolo
Hallo,
da ich in letzter Zeit mich intensiv mit den Array's beschäftigt habe, habe ich mir auch gedanken gemacht, wozu sie gut sein sollen. Natürlich dachte ich mir, Array's sollen genau so verwendet werden wie in BB, doch als ich mir GLBasic angeschaut habe, und gesehen habe,wofür Array's dort verwendet werden, dachte ich mir, das will ich auch! Nun was ist das? In GLBasic sind Array's eine Art Linked List wie in Bmax, eine Tlist. Und schwupps habe ich mir einen neuen Eintrag in der ToDo Liste gemacht! Da ja die Array's auf Banks basieren, ist es ziemlich schnell, einen neuen Eintrag hinzuzufügen und zu entfernen! Das heißt, SS2 wird Linked Lists unterstützen.
Nun, das war jetzt ein bisschen Design technisch, und jetzt kommen wir wieder zum Programmiertechnischen:
Array's haben nun, unendlich viele Dimensionen! Wobei es nicht zu empfehlen ist mehr als 3 Dimensionen zu verwenden, da es bei dieser Anzahl an Dimensionen schon etwas lange dauert die Position in der Bank zu berechnen... Aber wer braucht schon mehr als 3 Dimensionen?

Außerdem können Array's jetzt aich Float's und String's aufnehmen! Dadurch kann man bereits ziemlich interresante Dinge anstellen!
Das Resizen funtioniert noch nicht ganz, hierei kommen die ganzen Offsets durcheinander... Wobei das sicher schnell gefixt ist.
Hier ist mal ein kleiner Beispiel COde mit Strings:
Code: [AUSKLAPPEN]

dim("myarray$",10)
myarray(1)="BLUBB"
myarray(2)="Halllo Welt"
myarray(5)="Bye"

print(myarray(1))
print(myarray(2))
print(myarray(5))
Ausgabe:
BLUBB
Hallo Welt
Bye


Nebenbei habe ich eine kleine Spielerei eingebaut! Man kann jetzt ganz einfach Funktionen einfach umbenennen. Wozu soll das gut sein? Nunja, wenn man zbsp aus Bmax DrawOval gewohnt ist, aber es Oval heißt, kann man diese Funktion umbenennen:
Code: [AUSKLAPPEN]

oval(10,10,10,10)
renamefunction("oval","drawoval")
drawoval(20,20,20,20)

Die Arrays kommen!

Samstag, 28. Februar 2009 von coolo
Hallo,
da ich in letzter Zeit genug vom If Abfragen Programmieren und OOP entbuggen hatte, wollte ich mich auf etwas lustigerem wenden, den Arrays! Im Grunde genommen, sind Array's ganz normale Funktionen, dessen Rückgabewert der angegebene Wert ist. Das ganze basiert auf Bank und Types. Lange Rede kurzer Sinn, hier ist das Script:
Code: [AUSKLAPPEN]

dim("myarray",10)
myarray(1)=8
myarray(2)=7
myarray(5)=3
print(myarray(1))
print(myarray(2))
print(myarray(5))
;Ausgabe:
8
7
3


Jetzt denken einige sicher, wird es wieder nur 1 Dimensionale Arrays geben? Nein, es ist bereits möglich 2 Dimensionale Array's zu erstellen! Bei den mehrdimensionalen Array's, funktioniert die Formel für die Bank Position noch nicht ganz, wobei ich dies noch lösen werde.
Hier die Zwei Dimensionalen:
Code: [AUSKLAPPEN]

dim("myarray",10,5)
myarray(1,1)=8
myarray(2,2)=7
myarray(5,3)=3
print(myarray(1,1))
print(myarray(2,2))
print(myarray(5,3))
;Ausgabe:
8
7
3

Hier der Compilierte Code:
Code: [AUSKLAPPEN]

0: dim("myarray",10,5)
1: change_myarray(1,1,8)
2: change_myarray(2,2,7)
3: change_myarray(5,3,3)
4: print(myarray(1,1))
5: print(myarray(2,2))
6: print(myarray(5,3))

Außerdem habe ich das Elseif halb eingabeut, warum halb? Weil bei mehreren Elseifs es manchmal zu einer Endlosschleife führt, dies ist natürlich nicht wünschenswert, und ich werde das noch beseitigen!

Bis dann, euer coolo!

Gehe zu Seite Zurück  1, 2, 3, 4, 5, 6, 7, 8  Weiter