KRET LANGUAGE ACADEMY · DOKUMENTACJA ZE ŹRÓDEŁ
Od grafu do wykonania KretS
Czego się nauczysz
- Prześledź źródła i wyjaśnij opisany kontrakt.
- Prześledź FlowExecutedAsKretS i wskaż dowód wygenerowania oraz dowód wykonania.
Wymagania wstępne
- Ukończ Podstawy i wcześniejszy poziom tej ścieżki.
Wyjaśnienie krok po kroku
Po poprawnej walidacji grafu kompilacja i wykonanie stosują limity tej samej maszyny KretS. Wygenerowana funkcja nie uzyskuje szerszego dostępu niż ręcznie napisany kod. Rozdziel poprawność IR, generację źródła i wynik uruchomienia.
Praca z kodem źródłowym
Wykonanie przepływu w pluginie (Flow → KretS)
Oficjalna ścieżka wykonania KretFlow: kod KretS wygenerowany z grafu (`kret flow to-krets`) jest modułem `Restock` pluginu, a `Main.Start` go wywołuje. Wykonanie odbywa się w izolowanym procesie pluginu, z tymi samymi uprawnieniami i limitami co każdy kod KretS. Dodatkowo `kret flow run … --module` wykonuje graf w procesie narzędzia (host pozwala tylko na dziennik).
{
"format": "kretflow-ir/2",
"name": "Restock",
"variables": [
{ "name": "stock", "type": "Int64", "initial": "2" },
{ "name": "ordered", "type": "Int64", "initial": "0" },
{ "name": "cost", "type": "Int64", "initial": "0" },
{ "name": "note", "type": "String", "initial": "\"\"" }
],
"nodes": [
{ "id": "start", "kind": "trigger", "event": "stock.low", "position": { "x": 40, "y": 40 } },
{ "id": "enough", "kind": "loop", "expression": "stock < 10", "position": { "x": 200, "y": 40 } },
{ "id": "order", "kind": "assign", "variable": "ordered", "expression": "ordered + 4", "position": { "x": 360, "y": 0 } },
{ "id": "deliver", "kind": "assign", "variable": "stock", "expression": "stock + 4", "position": { "x": 520, "y": 0 } },
{ "id": "price", "kind": "action", "variable": "cost", "call": "Orders.price", "arguments": ["ordered"], "position": { "x": 360, "y": 120 } },
{ "id": "large", "kind": "condition", "expression": "cost > 100", "position": { "x": 520, "y": 120 } },
{ "id": "big", "kind": "assign", "variable": "note", "expression": "\"duże zamówienie\"", "position": { "x": 680, "y": 80 } },
{ "id": "small", "kind": "assign", "variable": "note", "expression": "\"zwykłe zamówienie\"", "position": { "x": 680, "y": 160 } },
{ "id": "say", "kind": "action", "call": "log.info", "arguments": ["note + \": \" + toString(ordered) + \" szt.\""], "position": { "x": 840, "y": 120 } },
{ "id": "done", "kind": "end", "expression": "note + \", sztuk: \" + toString(ordered) + \", koszt: \" + toString(cost)", "position": { "x": 1000, "y": 120 } }
],
"edges": [
{ "from": "start", "port": "next", "to": "enough" },
{ "from": "enough", "port": "body", "to": "order" },
{ "from": "order", "port": "next", "to": "deliver" },
{ "from": "deliver", "port": "next", "to": "enough" },
{ "from": "enough", "port": "done", "to": "price" },
{ "from": "price", "port": "next", "to": "large" },
{ "from": "large", "port": "true", "to": "big" },
{ "from": "large", "port": "false", "to": "small" },
{ "from": "big", "port": "next", "to": "say" },
{ "from": "small", "port": "next", "to": "say" },
{ "from": "say", "port": "next", "to": "done" }
]
}
Czytanie kodu linia po linii
Objaśnienia struktury nie są walidacją semantyczną. Szczegółowy kontrakt opisują referencje i README przykładu.
{Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej."format": "kretflow-ir/2",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku."name": "Restock",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku."variables": [Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.{ "name": "stock", "type": "Int64", "initial": "2" },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.{ "name": "ordered", "type": "Int64", "initial": "0" },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.{ "name": "cost", "type": "Int64", "initial": "0" },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.{ "name": "note", "type": "String", "initial": "\"\"" }Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.],Zamknięcie struktury otwartej we wcześniejszych liniach."nodes": [Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.{ "id": "start", "kind": "trigger", "event": "stock.low", "position": { "x": 40, "y": 40 } },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.{ "id": "enough", "kind": "loop", "expression": "stock < 10", "position": { "x": 200, "y": 40 } },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.{ "id": "order", "kind": "assign", "variable": "ordered", "expression": "ordered + 4", "position": { "x": 360, "y": 0 } },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.{ "id": "deliver", "kind": "assign", "variable": "stock", "expression": "stock + 4", "position": { "x": 520, "y": 0 } },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.{ "id": "price", "kind": "action", "variable": "cost", "call": "Orders.price", "arguments": ["ordered"], "position": { "x": 360, "y": 120 } },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.{ "id": "large", "kind": "condition", "expression": "cost > 100", "position": { "x": 520, "y": 120 } },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.{ "id": "big", "kind": "assign", "variable": "note", "expression": "\"duże zamówienie\"", "position": { "x": 680, "y": 80 } },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.{ "id": "small", "kind": "assign", "variable": "note", "expression": "\"zwykłe zamówienie\"", "position": { "x": 680, "y": 160 } },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.{ "id": "say", "kind": "action", "call": "log.info", "arguments": ["note + \": \" + toString(ordered) + \" szt.\""], "position": { "x": 840, "y": 120 } },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.{ "id": "done", "kind": "end", "expression": "note + \", sztuk: \" + toString(ordered) + \", koszt: \" + toString(cost)", "position": { "x": 1000, "y": 120 } }Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.],Zamknięcie struktury otwartej we wcześniejszych liniach."edges": [Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.{ "from": "start", "port": "next", "to": "enough" },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.{ "from": "enough", "port": "body", "to": "order" },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.{ "from": "order", "port": "next", "to": "deliver" },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.{ "from": "deliver", "port": "next", "to": "enough" },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.{ "from": "enough", "port": "done", "to": "price" },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.{ "from": "price", "port": "next", "to": "large" },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.{ "from": "large", "port": "true", "to": "big" },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.{ "from": "large", "port": "false", "to": "small" },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.{ "from": "big", "port": "next", "to": "say" },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.{ "from": "small", "port": "next", "to": "say" },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.{ "from": "say", "port": "next", "to": "done" }Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.]Zamknięcie struktury otwartej we wcześniejszych liniach.}Zamknięcie struktury otwartej we wcześniejszych liniach.
Oczekiwany wynik: „duże zamówienie, sztuk: 8, koszt: 120” w obu ścieżkach; `flow run` zwraca też status `Completed` i listę odwiedzonych bloków.
Typowy błąd: `kret flow run` bez `--module`: funkcje KretS projektu nie są dowiązane (`KCS-FLW-0013`, znane ograniczenie SDK-D01).
Instrukcja, wersje i zapisane wyniki →Materiały źródłowe do tego tematu
Przeczytaj powiązane rozdziały. Kod i kontrakty zachowano z importu; historia źródeł jest dostępna przy każdym rozdziale.
KretFlow — API / CLI
KretFlow — API / CLI
Polski
| API / polecenie | Opis |
|---|---|
kret flow to-krets <plik.kflow> | graf → KretS (każdy wiersz // @flow id) |
kret flow from-krets <plik.krs> --previous <plik.kflow> -o <wynik> [--force] | KretS → graf z zachowaniem położeń |
kret flow run <plik.kflow> --module <Script/X.krs> | wykonanie w narzędziu (host tylko z dziennikiem); bez --module → KCS-FLW-0013 (SDK-D01) |
kret flow blocks | katalog bloków kretflow-blocks/1 (EXPERIMENTAL) |
FlowCompiler / FlowRuntime / FlowHost / FlowDebugSession (C#) | kompilacja, wykonanie (stany Completed Failed Cancelled LimitExceeded NoCheckpoint), rejestr, debugowanie bloków |
KretFlow — specyfikacja (zakres kontraktu 1.0)
KretFlow — specyfikacja (zakres kontraktu 1.0)
Status 1.0: `FROZEN_SUPPORTED_SUBSET` — zamrożony dokładnie opisany zakres; reszta poza kontraktem 1.0. Gramatyka/wersja: kretflow-ir/2. Status języka nie nadaje uprawnień KCS ani prawa do działania w Production.Źródła normatywne (kopie w Sources/, kolejność pierwszeństwa: decyzje właściciela → zamrożony kontrakt → kod SDK → testy):
LANGUAGE_FREEZE_1_0/06_KRETFLOW_SPECIFICATION.md- SDK
04_Languages/KretFlow/SPEC.md
Elementy języka
| Element | Stan w KretFlow |
|---|---|
| Struktura pliku | JSON: format, name, variables[], nodes[], edges[] (from, port, to). |
| Rozszerzenie | .kflow. |
| Komentarze | brak (JSON). |
| Typy zmiennych | Bool Int64 Float64 String; wartość początkowa = wyrażenie KretS. |
| Warunki / pętle | bloki condition (true/false) i loop (body/done). |
| Funkcje | blok action wywołuje funkcję KretS (call, arguments, variable). |
| Limity | 1000 bloków, 4000 krawędzi, 256 zmiennych, 16 KiB tekstu w polu, 32 argumenty; wykonanie: 10 000 odwiedzonych bloków. |
Zakres poza kontraktem / ograniczenia
- przepływy równoległe i podprzepływy (nie istnieją)
- wyzwalacze czasowe w dokumencie (harmonogram po stronie hosta)
- zmienne typu lista/rekord
- oczekiwanie osobnego FlowRuntime w Core
kretflow-ir/2FROZEN_SUPPORTED_SUBSET; zmiana łamiąca →kretflow-ir/3.- Nowy blok = zmiana MINOR (polityka języka).
sdk-info:syntax: PROVISIONAL— rozbieżność z freeze.
Pełna referencja konstrukcji: SYNTAX_REFERENCE.md.
KretFlow — samouczek INTERMEDIATE
KretFlow — samouczek INTERMEDIATE
Status 1.0: `FROZEN_SUPPORTED_SUBSET` — zamrożony dokładnie opisany zakres; reszta poza kontraktem 1.0. Gramatyka/wersja: kretflow-ir/2. Status języka nie nadaje uprawnień KCS ani prawa do działania w Production.Cel: moduły, łączenie funkcji, dane, konfiguracja, komunikacja, obsługa błędów, interfejsy SDK.
Narzędzia: kret = <SDK>\Compiler\kret.exe (SDK 1.0.0-rc.3+kret.local.3), kretui-host = <SDK>\UiHost\kretui-host.exe. {DATA}/{OUT} = nowe, puste katalogi.
1. Wykonanie przepływu w pluginie (Flow → KretS) (KRETFLOW-I01-FlowExecutedAsKretS)
Projekt: ../../Examples/INTERMEDIATE_FlowExecutedAsKretS/ · klasyfikacja RUNNABLE_LOCAL · Playground LOCAL_EXECUTE
Kroki (katalog roboczy: katalog przykładu):
kret check . --json— w wyniku:"succeeded": truekret run . --policy host-policy.json --data {DATA}— w wyniku:koszt: 120kret flow run Flow/Restock.kflow --module Script/Orders.krs— w wyniku:Completed
Wynik tej rundy: PASS — zob. EXPECTED_OUTPUT.txt.
Ćwiczenie i sprawdzenie wiedzy
Prześledź FlowExecutedAsKretS i wskaż dowód wygenerowania oraz dowód wykonania.
Szkic nie jest wysyłany na serwer i znika po opuszczeniu lekcji. Przed wyjściem możesz go skopiować.Podpowiedzi
- KretFlow zapisuje logikę jako graf bloków (JSON, `kretflow-ir/2`). **Nie ma osobnego silnika przepływów**: graf jest obniżany do automatu stanów w KretS, kompilowany zwykłym kompilatorem i wykonywany przez tę samą maszynę, z tymi samymi uprawnieniami i limitami. Nazwa „KretFollow” nie występuje w żadnym źródle — to literówka, nie nazwa historyczna.
- Odczytaj ograniczenia i oczekiwane błędy z dostarczonego samouczka; check i run są oddzielnymi krokami.
Omówienie rozwiązania
Odpowiedź oprzyj na pokazanym kodzie i rozdziale źródłowym. Po poprawnej walidacji grafu kompilacja i wykonanie stosują limity tej samej maszyny KretS. Wygenerowana funkcja nie uzyskuje szerszego dostępu niż ręcznie napisany kod. Rozdziel poprawność IR, generację źródła i wynik uruchomienia.
Podsumowanie i następny krok
Po poprawnej walidacji grafu kompilacja i wykonanie stosują limity tej samej maszyny KretS. Wygenerowana funkcja nie uzyskuje szerszego dostępu niż ręcznie napisany kod. Rozdziel poprawność IR, generację źródła i wynik uruchomienia.
Zaloguj się na konto użytkownika, aby zapisywać postęp i zakładki. Konta obsługi mogą czytać bez zapisu postępu. Logowanie →