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 :-).