
# 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.