| |
|
|
| Ich arbeite grad an einem Update vom XPSE und ich habe die Keyworderkennung verbessert.
XPSE achtet jetzt nicht nur ob ein Identifier deklariert ist, sondern ob dieser auch das richtige Prefix und Postfix trägt.
Hierbei bin ich grad an einer interessanten Stelle angekommen, denn ich könnte nun den XPSE veranlassen nichtdeklarierte Variablen zu deklarieren. Das könnte heissen das man Variablen überhaupt nicht mehr deklarieren muss. Einfach verwenden, XPSE deklariert unauffällig im Hintergrund.
Dabei entstehen natürlich aber ein paar Fragen!
a) Der Programmieranfänger könnte sich verschreiben, und sich wundern das nicht gemackert wird das seine Variable nicht deklariert ist.
b) Wie soll XPSE entscheiden wenn eine in einer Prozedur verwendete Variable bereits im Parent (bzw. Global) deklariert ist. Was meint der XProfaner dann? Die Globale oder eine neue Locale?
c) Sollte es der Standard sein das das Autodeklarieren eingeschaltet ist, oder sollte es nur über Kompilerschalter aktivierbar sein?
d) Hab ich Fragen vergessen? |
|
|
| |
|
|
|
RGH | [quote:417b5c2a5a=iF]a) Der Programmieranfänger könnte sich verschreiben, und sich wundern das nicht gemackert wird das seine Variable nicht deklariert ist.[/quote:417b5c2a5a] Nicht nur Programmieranfänger machen Tippfehler! So eine automatisch deklarierte Variable würde in einem größeren Programm die Fehlersuche zum Horrorszenario machen. Da macht man mal einen Tippfehler, etwa bei der Zuweisung. Die Variable wid automatisch deklariert. Und dann sucht man sich einen Wolf, warum den dieser Wert nie zum tragen kommt. Es gibt ja so viele Möglichkeiten ... Das wäre für mich der Hauptgrund, dieses Feature nicht einmal anzubieten!
[quote:417b5c2a5a]b) Wie soll XPSE entscheiden wenn eine in einer Prozedur verwendete Variable bereits im Parent (bzw. Global) deklariert ist. Was meint der XProfaner dann? Die Globale oder eine neue Locale?[/quote:417b5c2a5a] Natürlich ist dann die globale, bzw. übergeordnete Variable zu nehmen. Woher sollte XPSE die Gewissheit nehmen, daß der Programmierer es nicht bewußt so gewollt hat?
Was ich mir vorstellen könnte, wenn XPSE in einen solchen Fall (nicht b)!) nachfragt: Variable xy nicht deklariert. Soll sie deklariert werden?. Klickt der Anwender auf ja, wird sie in den Quellcode am Anfang der Prozedur/des Programmes eingefügt, klickt er auf Nein, bricht XPSE ab, damit der Anwender seinen Code korrigieren kann.
Gruß Roland |
|
|
| Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 04.10.2006 ▲ |
|
|
|
|
| [quote:c10ff94482=RGH]Das wäre für mich der Hauptgrund, dieses Feature nicht einmal anzubieten![/quote:c10ff94482] Naja! Man deklariert nix in C (zumindest wird man nicht gezwungen dies innerhalb einer separaten Anweisung zu tun) und auch nicht in PHP. Es gibt riesige C und PHP-Programme - das mit der Fehlersuche als Begründung, das Feature garnicht anzubieten, halte ich aber nicht nur deshalb verkehrt, sondern auch weil das Debugging im Fehlerfall zumeist nicht daher rührt das man eine Variable falsch geschrieben hat!
Ich muss dazu gestehen, Variablendeklarationen nerven mich (Das hat nix mit Typendeklaration zu tun!) und ausser - das es für das bessere Verständnis beim Programmierenlernen hilft, sehe ich rein rechnerisch keinen Grund dazu - wenn der Programmierer selbst entscheidet, das er fähig ist auch ohne Deklaration von Variablen diese zu benutzen.
Ich halte das Ganze eher für ein tolles Feature statt ein Teufelswerk. Ich suche nur nach einem klaren und verständlichen Prinzip für die Umsetzung bei Grenzfällen.
Natürlich müssen Arrays und Strukturen weiterhin deklariert werden - ich würde mich auch erstmal nur auf einen Typ stürzen - natürlich die Longs. |
|
|
| |
|
|
|
| Nachtrag: Das beste ist wohl die Prozeduren gänzlich zu kapseln. Darin benutzte Variablen sind immer local.
Wenn man - und das gucke ich mir einfach dem Erfahrungsschatz von PHP ab - eine globale (oder übergeordnete) Variable meint, dann muss diese mit dem Schlüsselwort Global als Global deklariert werden.
Beispiel: KompilierenMarkierenSeparieren |
|
|
| |
|
|
|
Michael Wodrich | Dann muß wohl wieder mal ein Schalter her.
Ich würde es nicht so lustig finden, wenn eine Automatik mir lauter globale Variablen hinballert. Das möchte ich doch tunlichst vermeiden.
Und wenn jemand eine Variable gerne als globale haben möchte, dann soll er das bitte explizit angeben. Sonst sollte die Variable immer lokal sein.
Der Vorteil ist einfach: hat man sich daran gewöhnt alles lokal zu deklarieren und Dinge die woanders benötigt werden als Parameter weiterzureichen, dann hat man auch keine Probleme mit Threads und Prozessen.
Auch das Hauptprogramm kann auf globale Variablen verzichten:
Main Run_Main_Program End
Und schwups ist alles in Prozeduren und Funktionen im lokalen Umfeld. Wenn Roland jetzt noch die Systemvariablen in einem Namespace GLOBAL_VARS eintütet...
Schöne Grüße Michael Wodrich
War der Turbo-iF schon wieder schneller....... |
|
|
| Programmieren, das spannendste Detektivspiel der Welt. | 04.10.2006 ▲ |
|
|
|
|
| Genau Michael - soooooooooooo sehe ichs auch. ^^ |
|
|
| |
|
|
|
RGH | Also zumindest in C und C++ (und auch in Java) wird mit der Typdeklaration auch die Variable deklariert. Und im Falle eines Schreibfehlers an spätere Stelle wird nichts automatisch deklariert, sondern eine Fehlermeldung ausgegeben, daß die Variable noch nicht deklariert ist. Umgekehrt gibt es natürlich auch eine Fehlermeldung, wenn die Variable deklariert und sie im gleichen Block bereits deklariert ist.
Wollte man dieses mit XPSE in XProfan-Syntax übertragen, könne man ein neues Schlüsselwort einführen, etwa VAR und mit diesem dann wie in C die Variable on the Fly beim ersten Auftreten deklarieren: KompilierenMarkierenSeparieren (Dem entspräche in C/C++/Java: String X = Hugo Maier;) Diese Variable wäre natürlich lokal in der aktuellen Prozedur/Methode. Wenn ich so darüber nachdenke .... packe ich das gleich mal auf die ToDo-Liste für XProfan 11. Die Variante gefällt mir und dürfte auch recht rasch zu realisieren sein!
Der Gedanke, daß in einer Prozedur/Methode nur lokale Variablen bekannt sind, hat eine Menge für sich. XProfan lehnt sich hier aber an Pascal/Delphi an, in dem übergeordnete Variablen in Prozeduren/Funktionen bekannt sind. Ich habe auch schon darüber nachgedacht, dieses Verhalten per Compilerschalter zu steuern und das aus TurboBasic und Basic bekannte SHARED (anstelle des von iF vorgeschlagenen GLOBAL) zu verwenden, um auf Variablen der übergeordneten Ebene zugreifen zu können. Diese ist ja nicht zwangsläufig Global, sondern kann auch die aufrufende Prozedur sein. Aber ich schweife ab. Hier soll es ja um XPSE gehen und nicht m künftige XProfan-Versionen ... ;)
Gruß Roland |
|
|
| Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 04.10.2006 ▲ |
|
|
|
|
| Hm. Klar, var. Kann vom xprofaneigenen PreCompi erledigt werden - in Xprofan können ja IMHO Variablen eh onthefly deklariert werden.
Ich übe mich also einfach mal daran, einen mit einem Kompilerschalter zu aktivierenden Modus herzustellen, um optional die Autodeklaration einzuschalten. Vielleicht entstehen dabei ja lustige Gesetzmäßigkeiten welche kompatibel bleiben. |
|
|
| |
|
|
|
RGH | [quote:aa916e5c88=iF]in Xprofan können ja IMHO Variablen eh onthefly deklariert werden.[/quote:aa916e5c88] Sagen wir mal so: Das DECLARE kann an jeder Stelle im Programm stehen. Allerdings braucht es halt diese Extrazeile. VAR wäre daher sogar noch etwas schneller, allerdings nur, wenn es wirklich in XProfan eingebaut wird, und nicht per Precompiler in Declare X$ : X$ = umgewandelt wird. (DECLARE überprüft aus Tempogründen auch nicht, ob diese Variable bereits deklariert ist. Es wird einfach immer die zuletzt deklarierte Variable genommen. Aber das hat noch niemand angemeckert.) Mit VAR könnte man halt gleich eine Zuweisung verbinden und spart diese Extrazeile. In Java (meine derzeitige Hauptsprache in der Firma) habe ich mich ganz gut an diese Vorgehensweise gewöhnt.
Gruß Roland (vielleicht wird es doch schon in XProfan 10 undokumentiert drin sein ... ;) ) |
|
|
| Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 04.10.2006 ▲ |
|
|
|
|
| Grosse Klasse
<offtopic>PS: XPSE kann in der nächsten Version Umlaute, aber ich würde es nie zugeben und als Bug deklarieren. </offtopic> |
|
|
| |
|
|
|
Jac de Lad | <offtopic> Oh, das ist gut! </offtopic> |
|
|
| Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE) Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP | 05.10.2006 ▲ |
|
|
|