Dies ist eine Compiler-Direktive und funktioniert ähnlich wie ein Makro
Soweit ich weiß funktionieren Compiler-Direktiven generell nicht in Makros. Zumindest soweit "ICH" weiß
Ich finde den Hilfetext halt trotzdem blöd. With ist überall ein Kontext-Keyword bzw. Operator. Und lustigerweise ist es diesmal in PureBasic auch nichts anderes. Nur eben bezogen auf Strukturen.
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Linux Mint Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Linux Mint NAS: Fritz.Box 5690 Pro (Nur für Keepass-DB) Coding: Purebasic, Spiderbasic, GDevelop, Javascript/Node
Vielleicht liegt es daran, dass With...Endwith nicht verschachtelt werden kann ?
Wenn man ein Macro in einem With...Endwith-Block aufruft, ist das verschachtelt.
Ich kann das auch nur vermuten.
Hm, alles logisch und auch nicht...
Verschachteln könnte ich es auch in Prozeduren, Compilerdirektiven in Makros nicht zuzulassen finde ich auch nicht wirklich sinnvoll und dass es selbst wie ein Macro funktioniert sollte dem keinen Abbruch tun, weil das doch eigentlich auch gehen sollte.
Aber gut, dann isses halt so.
Wie willst du With...Endwith in Prozeduren verschachteln ?
Prozeduren werden so ausgeführt "wie sie da stehen".
Macros hingegen werden expandiert, d.h. Macroaufrufe werden vor dem compilieren durch das Macro 1:1 ersetzt.
Bin zu müde, das jetzt ausführlich zu erklären zu versuchen - sorry.
Ich weiß schon und ich glaube nicht, dass ich geschrieben habe, dass ich With verschachteln will. Ich meinte damit, dass ich es in einer Prozedur ebenfalls verschachteln könnte. Somit müsste das auch verboten sein.
Du verwechselst da was.
Ein Macro oder CompilerIf ist ein Kompiler-Konstrukt, dass heißt, der Macro-Code wird an Ort und Stelle eingefügt, sodass das With z.B. mitten in einem anderen With landen könnte usw.
Eine Prozedur ist ein Laufzeit-Konstrukt, dass heißt, der Prozedur-Code wird nicht eingefügt, sondern bleibt im Definitionsteil und wird erst zur Laufzeit aufgerufen.
Es geht nicht nur um den 'Aufruf' von With in einem Macro Body. Eventuell definiert With ein temporäres Macro um halt \ mit x\ zu ersetzen. Du hättest dann also eine Macro Definition in einer Macro Definition. Ob With nun ein richtiges Macro ist oder nur bestimmte Funktionen des Compilers verwendet, die sonst für Macros da sind, ist eine andere Frage, aber so stell ich mir das vor.
Define MyVar.POINT
Procedure MyProc()
With MyVar
If Random(2)
EndWith
EndIf
EndProcedure
While #True
MyProc()
EndWhile
Ich kann es gerade nicht testen, aber das dürfte zu einem Laufzeitfehler führen. Ob der Code in einer Procedure ist oder per Macro reinkopiert wird...pff.