Ob S. schrieb:
Wenn das so ist, sollte er nicht lauffähig sein. Also entweder einen
Laufzeitfehler liefern (im Interpreterbetrieb) oder einen
Compilezeit-Fehler (wenn halt compiliert wird).
Er ist lauffaehig (sofern die Hilfsklassen importiert sind), und er generiert auch das Richtige.
Ich betone noch mal den Hinweis: Es soll Code generiert werden, nicht nativ ausgefuehrt. Es handelt sich auch nicht um Code-Obfuscation.
Ich hole kurz aus:
In der nativ in Python ausgefuehrten Form saehe es so aus:
1 |
if a == 1:
|
2 |
b.next = 2
|
3 |
v.next = True
|
4 |
elif a == 2:
|
5 |
b.next = 1
|
6 |
v.next = False
|
7 |
else:
|
8 |
b.next = 4
|
9 |
v.next = False
|
Daraus z.B. C-Code zu erzeugen geht nicht direkt per Generierung, sondern nur per vorherige Uebersetzung per AST (abstract syntax tree) in ein ein explizites Konstrukt wie hier:
1 |
yield (
|
2 |
context.If(a == 1).Then(
|
3 |
b.set(2), v.set(True)
|
4 |
).Elif(a == 2).Then(
|
5 |
b.set(1), v.set(False)
|
6 |
).Else(
|
7 |
b.set(4), v.set(False)
|
8 |
)
|
9 |
)
|
Python ist leider dahingehend eingeschraenkt, dass man nicht einfach zwischen Generatoren und Ausfuehrung umschalten kann. Dazu muesste man eine Konditional-Struktur-Klasse (if, else, ..) ableiten sowie die Zuweisung ('=') per Metaprogrammierung umbiegen koennen.
Aus obigem laesst sich direkt per Ausfuehrung in Zielcode (gemaess context) transpilieren (hat einige Vorteile, das so zu tun).
Gibt noch ein paar andere Moeglichkeiten der lesbareren Darstellung.
Die Problemstellung sollte somit etwas plastischer geworden sein :-).