Files
RustAst/docs/Visual Editor 2.md
Michael Schimmel 494bf554d2 Old Docs added
2026-02-20 10:09:22 +01:00

6.2 KiB

Architekturkonzept: Hybrid Projectional Financial Editor

1. Motivation und Zielsetzung

Entwicklung einer Entwicklungsumgebung für Finanzanalysen (Backtesting, Indikatoren), die die Vorteile zweier Welten vereint:

  1. Visuelle Programmierung (Blöcke): Für die grobe Architektur, den Datenfluss und die Übersichtlichkeit. Vermeidet Syntaxfehler bei komplexen Verschachtelungen.
  2. Textuelle Programmierung (S-Expressions): Für mathematische Formeln und Detail-Logik. Ermöglicht schnelle Eingabe und präzises Editieren für Experten.

Das System verhält sich reaktiv (wie "Strudel" für Musik): Änderungen am Code oder an Parametern führen sofort zur Neuberechnung und Aktualisierung der Charts ("Live Coding").


2. Kern-Architektur (MVC)

Die Anwendung folgt strikt dem Model-View-Controller Muster, um Rendering von Logik zu trennen.

Model (Der AST & Environment)

  • Immutable AST: Der Abstract Syntax Tree besteht aus unveränderlichen Interfaces (IAstNode). Jede Änderung erzeugt einen neuen Teilbaum.
  • Environment (TAstEnvironment): Hält den Laufzeit-Zustand (Variablen, definierte Makros) und führt den Code aus.
  • Domain: Spezialisierte Datentypen für Finanzen (ISeries für Zeitreihen, TDecimal für Währung).

View (TWorkspace & TEditorFrame)

  • Aufgabe: Rein visuelle Darstellung. Kennt keine Logik, nur TControl-Hierarchien.
  • Rendering: Zeichnet Blöcke, Verbindungen und visuelle Container.
  • Input: Leitet Maus- und Tastatur-Events (Drag & Drop) an den Controller weiter.

Controller (TAstEditorController)

  • Aufgabe: Das "Gehirn". Synchronisiert AST und View.
  • Zustandsverwaltung: Hält den aktuellen validen AST (FCurrentAst).
  • Undo/Redo: Speichert Snapshots des ASTs auf einem Stack (Memento Pattern).
  • Reaktivität: Feuert OnChange bei jeder Modifikation, um die Ausführungspipeline anzustoßen.

3. Der Hybride Editor-Ansatz

Das System entscheidet dynamisch, wie ein AST-Knoten dargestellt wird ("Smart Nodes").

A. Die Makro-Ebene (Visuell)

Strukturelle Elemente werden als grafische Blöcke dargestellt:

  • Control Flow: If, Loop, Block (do...end).
  • Definitionen: VarDecl, MacroDef.
  • High-Level Funktionen: LoadCSV, Chart, Strategy.

Vorteil: Der Benutzer erkennt die Topologie der Strategie auf einen Blick ("Code Folding" durch Visualisierung).

B. Die Mikro-Ebene (Textuell / S-Expressions)

Mathematische Ausdrücke und Parameter werden als Text (Lisp-artige Syntax) dargestellt und editiert.

  • Beispiel: Statt eines Baums aus 5 Boxen sieht der User ein Label: (> Close (SMA Close 20)).

C. Drill-Down Editing (In-Place)

Der innovative Kern des Editors. Wenn ein User einen Knoten bearbeitet (Doppelklick), öffnet sich ein Texteditor über dem Knoten.

  1. Shallow Printing: Der Editor zeigt nicht den gesamten tiefen Baum als Text, sondern nutzt Platzhalter (#ID) für komplexe Unter-Knoten.
    • AST: If(Condition, ThenBlock, ElseBlock)
    • Text: (if #1 #2 #3)
  2. Kontext: Der Controller speichert in einem TEditContext, welcher AST-Knoten hinter #1 steckt.
  3. Navigation: Der User kann #1 mit dem Cursor ansteuern und per Shortcut (z.B. Ctrl+Space) "in-place" expandieren.
    • Text wird zu: (if (> Close #4) #2 #3)
  4. Commit: Beim Bestätigen (Enter) wird der Text geparst (TAstParser). Die Platzhalter werden durch die originalen, unveränderten AST-Knoten aus dem Kontext ersetzt.

Vorteil: Maximale Effizienz. Man editiert nur das, was man ändern will. Der Rest des Baumes bleibt vor versehentlichen Syntaxfehlern geschützt.


4. Reaktivität & Live Coding

Das System kompiliert und führt den Code permanent aus, nicht erst auf Knopfdruck.

Reactive Pipeline

  1. Änderung: User zieht einen Block oder ändert eine Zahl.
  2. Controller: Baut neuen AST -> OnChange.
  3. Runner: Führt FEnv.Run(NewAst) aus.
  4. UI Update: Charts und Indikatoren werden neu gezeichnet.

Number Scrubbing

Benutzer können Zahlenwerte (Konstanten) mit der Maus "ziehen" (drücken + ziehen).

  • Der Controller aktualisiert den AST "live" (hochfrequent).
  • Der Chart verändert sich flüssig während der Mausbewegung.
  • Ermöglicht intuitives Finden von Parametern (z.B. "Welche SMA-Länge passt visuell am besten?").

Code as UI (Widgets)

Der Code kann UI-Elemente zurückgeben, die im REPL-Output gerendert werden.

  • var len := Slider("Period", 10, 200) erzeugt einen Schieberegler.
  • Bewegt man den Regler, wird das Skript mit dem neuen Wert für len erneut ausgeführt.

5. Technische Komponenten (Zusammenfassung)

Komponente Verantwortung
TAstPrettyPrinter Wandelt AST-Knoten in S-Expressions ((func arg1 arg2)). Unterstützt "Shallow Printing" mit Platzhaltern.
TAstParser Wandelt S-Expressions zurück in AST-Knoten. Löst Platzhalter (#ID) über den TEditContext auf.
TEditContext Hält die Referenzen zwischen Text-Tokens (#1) und echten IAstNode-Instanzen während des Editierens.
TRtlRegistry Registriert Finanzfunktionen (SMA, RSI) und UI-Widgets (Slider, Chart).
TAstEditorController Orchestriert Edit-Vorgänge. Führt "Path Copying" durch, um den immutablen Baum nach einem Text-Edit zu aktualisieren.

6. User Workflow Beispiel

  1. Struktur bauen: User zieht LoadCSV, VarDecl (für SMA) und Chart als Blöcke in den Workspace.
  2. Logik verfeinern: User doppelklickt auf den Parameter des SMA.
  3. Text Edit: Ein kleines Popup erscheint. User tippt (* 20 2).
  4. Commit: Aus dem Text wird ein Multiplikations-Knoten. Der Block zeigt nun 40 (oder die Formel).
  5. Analyse: Der Chart zeigt sofort den SMA(40).
  6. Tuning: User klickt auf die 20 im Text/Label, zieht die Maus nach rechts. Die Zahl steigt auf 25. Der Chart aktualisiert sich in Echtzeit.
  7. Refactoring: User merkt, er braucht Logik. Er klickt auf den SMA-Block und drückt Ctrl+Space (Wrap in...). Wählt If.
    • Der SMA ist nun das "Then"-Kind eines neuen If-Blocks.
    • Die Struktur wurde geändert, ohne Text kopieren zu müssen.