| Vorwort
"Syntaktische Erweiterungen" hört sich zwar kompliziert an, bedeutet aber lediglich das ein und das Selbe anders geschrieben werden kann. Die durch XPSE gebotenen syntaktischen Erweiterungen werden vom XPSE in "normalen" aber optimierten XProfan-Quelltext konvertiert.
Ein einfaches Beispiel für eine syntaktische Erweiterung:
x&+
'oder
x&++
'oder
x&-
'oder
x&--
wird zu konvertiert.
Ein anderes Beispiel für eine syntaktische Erweiterung anhand einer For- Schleife, weil besonders an diesem Beispiel zu erkennen ist - das syntaktische Erweiterungen die Übersicht deutlich verbessern können und/oder das Schreiben erleichtern:
declare h& for h&:=500 downto 200 step 3 do begin print h& end wird zu
declare h& H&=500 WHILE H& >= 200 PRINT H& SUB H&,3 WEND H&=200 konvertiert.
Anhand diesem Beispiel wird die syntaktische Erweiterung des XPSE anhand des Konvertierens einer Funktion dargestellt:
declare h& cls h&=createhtmlbox(%Hwnd, "mshtml:InfoTestinfo" ,0,0,320,240) waitinput destroywindow(h&) end wird zu
DECLARE H&
USEDLL("ATL.DLL")
EXTERNAL("ATL.DLL","AtlAxWinInit")
PROC _XPSE_CREATEHTMLBOX
PARAMETERS HDL&,TXT$,XP&,YP&,XW&,YW&
RETURN CONTROL("AtlAxWin",TXT$,1345323008,
XP&,YP&,XW&,YW&,HDL&,0,%HINSTANCE,$200)
ENDPROC
CLS
H&=(_XPSE_CREATEHTMLBOX((%HWND),
"mshtml:<html><head></head><body><h1>Info</h1>Testinfo</body></html>",
(0),(0),(320),(240)))
WAITINPUT
DESTROYWINDOW(H&)
END
konvertiert.
Syntaktische Erweiterungen
<i>Befehlstrennung</i> | <b>Kurzfassung:</b> XPSE unterstützt ; und : um Befehle voneinander zu trennen. <b>Die Langfassung:</b>Viele Hochsprachenkompiler bieten heutzutage das Feature des zeilenunabhängigen Parsens des Quelltextes. Streng genommen ist es den meisten Kompilern sogar egal ob der gesammte Quelltext in einer einzelnen Zeile, oder über mehere Zeilen verteilt ist. Damit dies ohne Umwege möglich ist gibt es "Befehlstrennungszeichen". In den meisten Hochsprachen ist dies Heutzutage das Semikolon. Mit dem Semikolon werden Befehle voneinander abgetrennt,- der Kompiler muss dann nicht mehr Zeilengebunden parsen. Dies kann ganz allgemein bei der Programmierung, bei der Eingabe und im Bezug auf die Übersicht von Quelltexten, viele Vorteile mitsich bringen.
Es ist nur leider so, daß die zeilenorientierten Parser das Abtrennen von Befehlen mit einem Befehlstrennungszeichen zumeist nicht unterstützen, und im Umkehrschluß - die Parser welche ausschließlich Befehle mit Befehlstrennungszeichen erwarten, keine Zeilenorientation mitsich bringen. Die Schwierigkeit ist es nun, da XProfan-Programmierer es gewohnt sind auf einen zeilenorientierten Parser zu vertrauen, beides nebenher zu ermöglichen. Dem XSPE gelang dies. XPSE bietet seit XProfan8 die Möglichkeit Befehle mit dem gewohnten Befehlstrennungszeichen "Semikolon" zu trennen - wann immer man möchte - aber mit dem Vorteil es nicht zu "müssen". RGH implementierte dann dieses Feature in die darauf folgende XProfan- Version 9. Seither bietet XProfan ebenfalls die Möglichkeit mit einem Befehlstrennungszeichen Befehle voneinander zu trennen. Jedoch nicht per Semikolon, sondern per Doppelpunkt.
Nun stand der XPSE natürlich auf dem Prüfstand. Er musste nun nicht nur dafür sorgen Zeilenorientiert oder Semikolongetrennt zu parsen, sondern es kam auch noch ein zweites Befehlstrennungszeichen dazu - welches korrekt verarbeitet werden musste. Die Schwierigkeit ist, da XProfan ja auch innerhalb der eigenen Syntax an manchen Stellen Semikolons und Doppelpunkte erwartet, trotzdem genau unterscheiden zu können wann ein neuer Befehl beginnt. Dem XPSE gelang auch dies. Mit dem XPSE kann sogar innerhalb einer einzigen Zeile wild zwischen den Befehlstrennungzeichen gewechselt werden. Sogar Anweisungen wie Case (welche einen Doppelpunkt erwartet) oder SetWindowpos (welche ein Semikolon erwartet) [und alle anderen Befehle welche ein oder mehrere Semikolons erwarten) werden beim wilden Mischen von Befehlstrennungszeichen immer richtig erkannt. Es ist mir kein Erkennungsfehler bekannt und die Anwendung dieses Features eine permanente Freude.
| >export Export | Prozeduren / Funktionen in Units werden vom XPSE automatisch in eine .def Datei geschrieben - sei denn - es wird das Schlüsselwort noexport an den Prozedurnamen "mit Freizeichen getrennt" angehangen. Zur Unterstützung von Unit-Programmierern gibt es das Schlüsselwort "export". Obwohl XPSE jede "nicht-mit-noexport-gekennzeichnete" Prozedur/Funktion in die .def-Datei schreibt - bietet XPSE mit dem Schlüsselwort "export" die Möglichkeit, der eine Art Hilfetext für die jeweilige mit "export" gekennzeichnete Prozedur anzufügen. Dieser Hilfetext wird in die .hlp.htm- Datei geschrieben.
Dies ist sehr hilfreich wenn man sich ein nachträgliches Schreiben einer Hilfedatei ersparen möchte. Siehe hierzu auch den Kompilerschalter {$preferednamespace }.
| >noexport NoExport | Wenn eine UnitProzedur oder UnitFunktion nicht automatisch vom XPSE in die .def Datei geschrieben werden soll - dann ist einfach das Schlüsselwort "noexport" - mit Freizeichen getrennt - hinter den Namen der Prozedur/Funktion zu schreiben. Die Funktion ist damit als "nicht-öffentlich" gekennzeichnet und sollte dann auch nur innerhalb der Unit verwendet werden.
| >for <i>For-Schleifen</i> | XPSE unterstützt For-Schleifen nach Pascal-Syntax.
Um Abwärts zu zählen, ist wie auch zu erwarten das "downto" statt "to" zu verwenden.
Auch der optionale "Step"-Parameter wird unterstützt um die Schrittweite selbst zu bestimmen.
oder Abwärts:
| >asmstart <i>InlineAssembler</i> | Wo "vorkompiliert" wird, können auch leicht Plugins für den Vorkompiler hergestellt werden. Diese Chance ergriff Frank Abbing (https://frabbing.de ) und stellte das Erste XPSE-PlugIn XPIA her, und später den XPRR .XPIA steht für XProfanInlineAssembler.
XPIA macht es möglich das innerhalb des XProfanprogrammes Prozeduren/Funktionen in [High-Level]-Assembler geschrieben werden können. Innerhalb des XProfanprogrammes kann auf das Ergebnis der Assemblerfunktionen ohne Probleme zugegriffen werden. Das Prinzip funktioniert so: XPSE bearbeitet den Quelltext wie gewohnt - achtet jedoch auf Assemblerpassagen welche mit ASMSTART eingeleitet, und mit ASMEND beendet werden. Es gibt auch ASMINCLUDE . Es können beliebig viele Assemblerpassagen im XProfanquelltext vorkommen. Vor dem Kompilieren - und bei Vorhandensein von Assemblerpassagen im Quelltext - wird XPIA mit dem zu bearbeitenden Quelltext gestartet. XPIA eruiert und trennt die einzelnen Assemblerpassagen und erzeugt ASM-Projekte die wiederum durch XPIA an einen Assemblerkompiler derart weitergegeben werden, daß der Assemblerkompiler eine entsprechende DLL mit dem native-kompilierten Assemblercode erstellt. Anschließend schreibt XPIA den XProfanquelltext derart um das an Stelle der Assemblerpassagen die DLL-Aufrufe stattfinden. Die erzeugte DLL wird anschließend von XPIA in einen XProfan-Quelltext konvertiert - welcher die DLL wärend der Laufzeit entpackt - so daß diese nicht mitgeliefert werden muß! Es bleibt also dabei das lediglich die Programm-Exe mitgeliefert werden muß. Das Assembler wird komplett in die EXE verpackt. Die in den Quelltext konvertierten DLL sind auch noch derart klein - das diese den Quelltext nicht aufblähen. I.d.R ist die DLL grade mal 8192 Byte groß! Das Inlineassember für XProfan war damit geboren. :)
| <i>INC und DEC</i> | Variablenwert erhöhen und verringern. Einfache Syntax zur Variablenin- und dekremierung - auch wieder angelehnt an die C++ / PHP Syntax. Mittels dem Suffix ++ kann eine Variable um 1 erhöht werden, mit dem Suffix -- verringert.
'Beispiel:
declare i%
i%++
//oder
i%--
Diese Variante wird z.B. in i%=i%+1 umgewandelt, es gibt jedoch lt. der Profanhilfe auch schnellere Funktionen, um eine Variable zu erhöhen oder zu verringern. Gemeint ist damit "INC" und "DEC". Dafür bietet XPSE eine noch komfortablere Variante:
'Beispiel:
declare i%
i%+
//oder
i%-
Statt "DoppelPlus" bzw "Doppelminus" einfach ein einfaches "Plus" oder "Minus", und schon wird der Code nicht in i%=i%+1, sondern in inc i% konvertiert. Es gibt wohl nichts Einfacheres als i%+ zu schreiben, um i% um 1 zu erhöhen!
<i>Experimentell/Fun: Bei Longs kann auch ohne Angabe des Variablensuffixes derart gearbeitet werden. Wird kein Variablensuffix angegeben, so nimmt XPSE an es ist ein Long. Wer also z.B. ein Long namens cnt& Inkremieren möchte braucht nur cnt+ oder cnt++ schreiben. Wobei auch hier gilt: cnt+ ist schneller als cnt++</i>
| <i>Remarks/Rems</i> | Besonders für Programmierer, welche nicht ausschließlich in XProfan programmieren, sind diese zwei zusätzlichen Remark-Varianten ein Willkommensgeschenk. Diese beiden Remvarianten sind unter Anderem aus C++ und PHP bekannt. Es kann // oder /* text */ genutzt werden.
Das Auskommentieren eines ganzen Blockes mittels /* text */ ist also mit XPSE möglich und auch die IDE XProfEd unterstützt dies. Somit können ganze Textpassagen einfach und schnell ausgeklammert werden.
'Beispiel:
....Zeile1
/*....Zeile2
....Zeile3
....Zeile4 */
....Zeile5
es kann auch innerhalb einer Zeile geRemarkt werden. print "Hallo Welt",/*hier ein rem*/&gettickcount
'auskommentieren mittels //
print "Hallo Welt"//hier der Kommentar, welcher beim Zeilenende endet
| <i>Repeat/Until</i> | XPSE ermöglichte fußgesteuerte Repeat-Until Schleifen. Bis XProfan8 waren solche Schleifen nur mit XPSE möglich. In XProfan9 hat Roland das Repeat- Until fest integriert. In den seither nachfolgenden Versionen des XPSE wird das Repeat-Until also nicht mehr durch XPSE umgesetzt werden, da dies nun nicht mehr nötig ist und Rolands Variante durch den Festeinbau zügiger ist.
| >swap Swap | Swap tauscht den Inhalt zweier Variablen gleichen Typs.
Gibt folgendes aus: 20 10
| <i>Zuweisungs/Vergleichsoperatoren</i> | C++ / Delphi & PHP'er sind es z.B. gewohnt im Gegensatz zu Basicprogrammierern für das "Zuweisen von Variablen" und das "Vergleichen von Variablen" eine unterschiedliche Syntax zu verwenden. Dies ist schlichtweg übersichtlicher und hilft bei der genaueren Interpretierung durch den Menschen. In Basic - so auch in XProfan - ist das Gleichheitszeichen ein Zuweisungs- <b>und</b> Vergleichoperator. Beim Lesen von XProfan-Code durch einen nicht- XProfan-Programmierer können hier empfindliche Mißverständnisse entstehen.
Es kann natürlich auch weiterhin "Zugewiesen" und "Verglichen" werden wie gewohnt. XPSE schränkt nicht ein - sondern soll "Erweitern". XPSE bietet für XProfaner nun zumindest die augenscheinliche Möglichkeit zwischen Zuweisungs- und Vergleichsoperator zu unterscheiden.
Operation | XProfan | C++/PHP | Delphi | XProfan mit XPSE
| Wertzuweisung | = | = | := | <i>alle diese Varianten</i>
| Vergleich | = | == | = | <i>alle diese Varianten</i> |
'Beispiel:
if (a%==b%)
a%:=b%*4
endif
| <i>Funktionen</i> | Die "alten" Createfunktionen bleiben erhalten! Die "alten" Createfunktionen bleiben dank automatischer Umwandlung in die "neue" Createsyntax erhalten und werden sogar erweitert.
<b>Folgende Funktionsnamen können einfach weiterverwendet werden:</b>
· CREATETEXT · CREATEDIALOG · CREATECHOICEBOX · CREATELISTBOX · CREATESORTEDLISTBOX · CREATETABCONTROL · CREATEWINDOW · CREATEGROUPBOX · CREATEEDIT · CREATEMULTIEDIT · CREATEBUTTON · CREATEDEFBUTTON · CREATEDATEEDIT · CREATETIMEEDIT · CREATESPINEDIT · CREATEPICBUTTON · CREATEICONBUTTON · CREATEHTMLBOX · CREATETOOLWINDOW · CREATELEFTBUTTON · CREATECENTERTEXT · CREATERIGHTTEXT · CREATESUNKENTEXT · CREATESUNKENCENTERTEXT · CREATESUNKENRIGHTTEXT · CREATESTATIC · CREATEBLACKFRAME · CREATEBLACKRECT · CREATEHTMLBOX
Das Control HTMLBOX ist ein Control aus der ATL.DLL. Es wird hierbei der IE als Anzeigemodul genutzt. CreateHtmlBox kann genau wie z.B. Createtext ohne Umwege erstellt werden. Der als 2. Parameter übergebene Text kann entweder eine "URL" sein, oder ein direkter html beginnend mit "mshtml:". Diese Funktion ist z.B. interessant für einfache About-Boxen oder Hilfedateien. Ich konnte in meinen Versuchen mindestens 32K Html direkt per MSHTML: übergeben - und der Inhalt wurde immer korrekt angezeigt. Wenn eine lokale HTML-Datei angezeigt werden soll, dann ist das "file:///c:/ordner/htmldatei.html"-Format zu nutzen. Das Control ist auch hervorragend zu nutzen um z.B. Bilddateien anzuzeigen - da der IE nahezu jedes Format darstellen kann.
|
|
Für die Parameter ist auch einfach die "alte" Form zu nutzen, denn XPSE setzt diese vollständig um:
| >oop <i>OOP</i> | Auch für den OOP-Begeisterten XProfaner bietet XPSE hier und da ein paar experimentelle Features. Zum einen den Operator :: und zum Anderen das Schlüsselwort this->. Aber auch die Möglichkeit des Weglassens des Suffixes für die Bereichsvariable welche die Klasse aufnimmt ist sehr interessant!
Um es kurz zu fassen hier zum Einen das "normale", und zum Anderen eine Möglichkeit die mit XPSE genutzt werden <u>kann</u>.
Innherhalb von Klassen kann also auf Methoden der gleichen Klasse mit this-> zugegriffen werden (erspart das wiederholte Tippen der Klassenbezeichnung) und ausserhalb von Klassen kann auf Methoden mittels :: zugegriffen werden. Bei der Verwendung von new und :: und dispose kann auf die Angabe des Rautezeichens für die Bereichsvariable verzichtet werden. (ausgenommen Arrays von Bereichsvariablen) Im Allgemeinen Umgang mit XProfanOOP hat sich dies als sehr praktisch erwiesen!
| >include Include | Inkludiert Quelltextdateien, Headerdateien oder Units. Je nach Endung der Datei wird sie entsprechend eingebunden.
Wird "#include" statt "include" geschrieben passt XPSE darauf auf das die Include auch nur ein Mal eingebunden wird - egal wie oft der Aufruf vorkommt. Ähnlich wie PHP's "include_once".
Um eine Include-Datei einzubinden wird in XProfan der Compilerschalter "$I" benutzt. XPSE'ler können aber auch Include oder #include schreiben - das Verhalten bleibt gleich. Besonders bei Includes erhöht XPSE den Komfort. Es ist nun z.B. möglich, einfach die Dateiendung wegzulassen - es wird automatisch nach inc und prf gesucht. Ebenso, wenn XPSE die Include nicht im eigenen Verzeichnis findet, wird diese Reihenfolge genutzt, um den Ort der Include festzustellen:
· /.inc · /include · /includes · /include/.inc · /includes/.inc · /.prf · /include/.prf · /includes/.prf
Man braucht also nur noch '#include myinc' schreiben, selbst wenn sich die Inc oder Prf nicht im selben Verzeichnis, sondern in einem der genannten Unterordner befindet.
Es werden auch die im ProfanEditor angegebenen Includepfade berücksichtig. Siehe auch Compilerschalter:{$Includepath ...}
| Inkludiert die Quelltextdatei "meine.inc". |
| Inkludiert das HeaderFile "windows.ph". |
| Inkludiert die Unit "lists.pcu" mit dem Namensraumsymbol "lst.". |
| >const Const | Const ist ein sehr mächtiges Werkzeug des XPSE. Mit Const werden Konstanten oder ganze Syntaxblöcke definiert. Die Verwendung dieser Konstanten statt der Def -Konstanten empfehle ich da diese nicht zur Laufzeit, sondern beim Kompilieren umgesetzt werden - was einen Geschwindigkeitsvorteil bedeutet, und da diese Konstanten kein lästiges PreFix tragen müssen.
|
|
|