KRET LANGUAGE ACADEMY · DOKUMENTACJA ZE ŹRÓDEŁ
Graf jest źródłem programu
Czego się nauczysz
- Prześledź źródła i wyjaśnij opisany kontrakt.
- W GraphCheckToKretS znajdź węzły i krawędzie, a następnie powiąż jeden krok grafu z kodem wynikowym.
Wymagania wstępne
- Ukończ Podstawy i wcześniejszy poziom tej ścieżki.
Wyjaśnienie krok po kroku
KretFlow używa JSON kretflow-ir/2. Bloki i połączenia tworzą graf, który jest obniżany do automatu stanów KretS. Nie istnieje osobny silnik przepływów. Zaczynaj od identyfikatorów węzłów i ich krawędzi, następnie czytaj wygenerowane KretS.
Praca z kodem źródłowym
Graf bloków, walidacja i podgląd jako KretS
Przepływ `Flow/Restock.kflow` (format `kretflow-ir/2`, JSON) z szablonu SDK: wyzwalacz, pętla, przypisania, akcja wywołująca funkcję KretS, warunek i koniec. `kret check` sprawdza wyrażenia w blokach kompilatorem KretS, `kret flow to-krets` pokazuje równoważny kod KretS (każdy wiersz oznaczony `// @flow id`), `kret flow blocks` wypisuje katalog bloków (`kretflow-blocks/1`, EXPERIMENTAL).
{
"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: Projekt jest poprawny; wynik `to-krets` jest identyczny z `Flow/Restock.krs` z szablonu; katalog bloków ma format `kretflow-blocks/1`.
Typowy błąd: Szukanie osobnego silnika przepływów: nie istnieje. Przepływ jest obniżany do KretS i wykonywany przez tę samą maszynę.
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 — wprowadzenie
KretFlow — wprowadzenie
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.Czym jest
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.
Dla początkujących
Układasz klocki: wyzwalacz, przypisanie, akcja (wywołanie funkcji KretS), warunek, pętla, opóźnienie, koniec — i łączysz je strzałkami (porty next, true/false, body/done). SDK zamienia taki graf na czytelny kod KretS (kret flow to-krets) i odwrotnie (from-krets).
Dla zaawansowanych programistów
Reguły grafu: jeden wyzwalacz, każdy port podłączony raz, cykl tylko przez body bloku loop, port error bloku action przejmuje błąd. Wyrażenia to wyrażenia KretS sprawdzane kompilatorem. Synchronizacja kod⇄graf jest bajtowo powtarzalna; konstrukcje bez odpowiednika trafiają do bloku code (KCS-FLW-0020). Punkty kontrolne obsługuje host przepływów (broker pluginów odrzuca flow.checkpoint). Funkcje ochronne (thermal, emergency, watchdog) zakazane (KCS-FLW-0010). SDK-D01: kret flow run bez --module nie wiąże modułów projektu (KCS-FLW-0013); z --module działa (sprawdzone w tej rundzie).
Jakie problemy rozwiązuje
Wizualny zapis logiki krokowej bez drugiego, nieweryfikowanego silnika wykonania.
Kiedy używać
- przepływy przetwarzania danych i logika krokowa
- generowanie kodu KretS z grafu
- dokumentowanie logiki w formie diagramu
Kiedy nie używać
- 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
Współpraca z innymi technologiami
KretS (cel obniżania, funkcje w blokach action), KretStudio (edytor bloków, „Show as KretS”), KretL (uprawnienia kodu wygenerowanego).
Obecny status
FROZEN_SUPPORTED_SUBSET — zamrożony dokładnie opisany zakres; reszta poza kontraktem 1.0.
Dalej: ARCHITECTURE.md · SYNTAX_REFERENCE.md · ../Tutorials/BASIC/TUTORIAL_PL.md
KretFlow — referencja składni
KretFlow — referencja składni
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.Opisane są wyłącznie konstrukcje potwierdzone implementacją SDK (i, gdzie zaznaczono, testami tej rundy).
trigger
Wyzwalacz (dokładnie jeden).
{ "id": "start", "kind": "trigger", "event": "stock.low" }
Czytanie kodu linia po linii
Objaśnienia struktury nie są walidacją semantyczną. Szczegółowy kontrakt opisują referencje i README przykładu.
{ "id": "start", "kind": "trigger", "event": "stock.low" }Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
| Cecha | Wartość |
|---|---|
| Parametry / typy | event |
| Wynik | port next |
| Wymagania | bez krawędzi wejściowych |
| Ograniczenia | — |
| Możliwe błędy | KCS-FLW-0005 |
| Wprowadzono | ir/2 |
assign
Przypisanie wyrażenia KretS do zmiennej.
{ "id": "a", "kind": "assign", "variable": "stock", "expression": "stock + 4" }
Czytanie kodu linia po linii
Objaśnienia struktury nie są walidacją semantyczną. Szczegółowy kontrakt opisują referencje i README przykładu.
{ "id": "a", "kind": "assign", "variable": "stock", "expression": "stock + 4" }Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
| Cecha | Wartość |
|---|---|
| Parametry / typy | variable, expression |
| Wynik | next |
| Wymagania | — |
| Ograniczenia | — |
| Możliwe błędy | KCS-FLW-0013/0014 |
| Wprowadzono | ir/2 |
action
Wywołanie funkcji KretS (opcjonalnie wynik do zmiennej).
{ "id": "price", "kind": "action", "variable": "cost", "call": "Orders.price", "arguments": ["ordered"] }
Czytanie kodu linia po linii
Objaśnienia struktury nie są walidacją semantyczną. Szczegółowy kontrakt opisują referencje i README przykładu.
{ "id": "price", "kind": "action", "variable": "cost", "call": "Orders.price", "arguments": ["ordered"] }Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
| Cecha | Wartość |
|---|---|
| Parametry / typy | call, arguments, variable |
| Wynik | next, opcjonalnie error |
| Wymagania | funkcja istnieje (sprawdza kompilator) |
| Ograniczenia | funkcje ochronne zakazane |
| Możliwe błędy | KCS-FLW-0010, KCS-KRS-1003 |
| Wprowadzono | ir/2 |
condition / loop
Rozgałęzienie i pętla.
{ "id": "large", "kind": "condition", "expression": "cost > 100" }
{ "id": "enough", "kind": "loop", "expression": "stock < 10" }
Czytanie kodu linia po linii
Objaśnienia struktury nie są walidacją semantyczną. Szczegółowy kontrakt opisują referencje i README przykładu.
{ "id": "large", "kind": "condition", "expression": "cost > 100" }Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.{ "id": "enough", "kind": "loop", "expression": "stock < 10" }Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
| Cecha | Wartość |
|---|---|
| Parametry / typy | expression (Bool) |
| Wynik | true/false; body/done |
| Wymagania | cykl tylko przez body |
| Ograniczenia | — |
| Możliwe błędy | KCS-FLW-0006 |
| Wprowadzono | ir/2 |
delay / checkpoint / code / end
Opóźnienie (0 ms – 24 h), punkt kontrolny (host przepływów), kod KretS bez zmian, koniec z wynikiem.
{ "id": "w", "kind": "delay", "durationMs": 500 }
{ "id": "done", "kind": "end", "expression": "toString(stock)" }
Czytanie kodu linia po linii
Objaśnienia struktury nie są walidacją semantyczną. Szczegółowy kontrakt opisują referencje i README przykładu.
{ "id": "w", "kind": "delay", "durationMs": 500 }Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.{ "id": "done", "kind": "end", "expression": "toString(stock)" }Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
| Cecha | Wartość |
|---|---|
| Parametry / typy | wg bloku |
| Wynik | next / brak |
| Wymagania | — |
| Ograniczenia | flow.checkpoint odrzucany przez broker pluginów |
| Możliwe błędy | KCS-FLW-0016 |
| Wprowadzono | ir/2 |
KretFlow — samouczek BASIC
KretFlow — samouczek BASIC
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: pierwszy plik, podstawowa struktura, najprostszy działający przykład, najczęstszy błąd, sposób uruchomienia.
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. Graf bloków, walidacja i podgląd jako KretS (KRETFLOW-B01-GraphCheckToKretS)
Projekt: ../../Examples/BASIC_GraphCheckToKretS/ · klasyfikacja VALIDATION_ONLY · Playground PUBLIC_STATIC
Kroki (katalog roboczy: katalog przykładu):
kret check . --json— w wyniku:"succeeded": truekret flow to-krets Flow/Restock.kflow— w wyniku:@flowkret flow blocks— w wyniku:kretflow-blocks
Wynik tej rundy: PASS — zob. EXPECTED_OUTPUT.txt.
Ćwiczenie i sprawdzenie wiedzy
W GraphCheckToKretS znajdź węzły i krawędzie, a następnie powiąż jeden krok grafu z kodem wynikowym.
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. KretFlow używa JSON kretflow-ir/2. Bloki i połączenia tworzą graf, który jest obniżany do automatu stanów KretS. Nie istnieje osobny silnik przepływów. Zaczynaj od identyfikatorów węzłów i ich krawędzi, następnie czytaj wygenerowane KretS.
Podsumowanie i następny krok
KretFlow używa JSON kretflow-ir/2. Bloki i połączenia tworzą graf, który jest obniżany do automatu stanów KretS. Nie istnieje osobny silnik przepływów. Zaczynaj od identyfikatorów węzłów i ich krawędzi, następnie czytaj wygenerowane KretS.
Zaloguj się na konto użytkownika, aby zapisywać postęp i zakładki. Konta obsługi mogą czytać bez zapisu postępu. Logowanie →