rbs_demo – Beispiel-App für das rbs-Regelsystem
Zusammenfassung
rbs_demo ist die Beispiel-App für die rbs-Bibliothek
(rbs – Regel-Engine): ein klassisches Wetter-Programm, das
Fakten, Regeln, Effekte und den sm-Lebenszyklus in einer lauffähigen
App zeigt.
Wenn es regnet oder bewölkt ist → nass. Wenn man nass ist → Schirm. Wenn man erwachsen ist → bezahlt man (Effekt: −10 Geld).
Projektstruktur
src/
├── app.h # deklarative Programmstrukturen: Token-/Value-Enums, Namen,
│ # Regeln, Effekte, Zustands-Slots, Handler-Prototypen
├── app.c # alle Handler (Slot-Handler, Schritt-Callback) + Konstruktor/
│ # Destruktor sm_on_start/sm_on_stop (Lebenszyklus)
└── main.c # main(): rbs-Konfiguration + fsm-Verdrahtung + Start
Die Trennung folgt der rbs-Semantik: Daten (Wissen) liegen deklarativ in
app.h, Handlungslogik (externe Faktenquellen, Lebenszyklus) in app.c,
der Einstieg verdrahtet nur noch (main.c).
Lebenszyklus (Konstruktor/Destruktor)
Der Lebenszyklus ist über die sm-Callbacks sm_on_start/sm_on_stop
umgesetzt (weak, api-Muster; werden in app.c stark definiert). Sie laufen
im Worker-Thread von sm ganz am Anfang bzw. Ende:
sm_on_start= Konstruktor: legt die rbs-Buffer an (rbs_create_facts_buffer/rbs_create_memory_buffer), initialisiert sie, setzt die Welt-Konstanten (AGE,MONEY) und die Ausgangslage (RAIN,CLOUDY).sm_on_stop= Destruktor: bilanziert die Endfakten (z. B.UMBRELLAgesetzt?) und gibt die Buffer wieder frei.
Damit ist die Speicherverwaltung im Thread-Lebenszyklus angesiedelt:
Aufbau im Konstruktor, Abbau im Destruktor; main speist keine Fakten mehr
ein, sondern nur die statische Verkabelung.
CMake-Muster
add_subdirectory(../../libraries/rbs ${CMAKE_BINARY_DIR}/rbs)
target_link_libraries(rbs_demo PUBLIC m rbs)Die rbs-Bibliothek zieht ihre Abhängigkeiten (sm, logging, m)
transitiv per PUBLIC-Link mit. app.h liegt im src/-Include-Pfad;
Bibliotheks-Header kommen mit spitzen Klammern (<rbs/rbs.h>, <sm/sm.h>).
Ausgabe
app: fsm startet (wetter: es regnet und ist bewoelkt)
step 1 | UMBRELLA: false | MONEY: 100
wetter: regen klaert auf
step 2 | UMBRELLA: true | MONEY: 90
app: UMBRELLA ist gesetzt (fsm beendet)
rbs main end
Quellen
- Repo: https://github.com/deppenkaiser/rbs_demo (public, Apache-2.0)
apps/rbs_demo/{CMakeLists.txt,src/*},libraries/rbs(Bibliothek)- Build & Test:
cmake -S . -B build && cmake --build build && ./build/bin/rbs_demo