Przejdź do treści

KRET LANGUAGE ACADEMY · DOKUMENTACJA ZE ŹRÓDEŁ

Graf jest źródłem programu

BASIC20 min
Postęp nauki 0 / 3
Zaloguj się na konto użytkownika, aby zachować postęp.

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.

  1. {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  2. "format": "kretflow-ir/2",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  3. "name": "Restock",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  4. "variables": [Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  5. { "name": "stock", "type": "Int64", "initial": "2" },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  6. { "name": "ordered", "type": "Int64", "initial": "0" },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  7. { "name": "cost", "type": "Int64", "initial": "0" },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  8. { "name": "note", "type": "String", "initial": "\"\"" }Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  9. ],Zamknięcie struktury otwartej we wcześniejszych liniach.
  10. "nodes": [Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  11. { "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.
  12. { "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.
  13. { "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.
  14. { "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.
  15. { "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.
  16. { "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.
  17. { "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.
  18. { "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.
  19. { "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.
  20. { "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.
  21. ],Zamknięcie struktury otwartej we wcześniejszych liniach.
  22. "edges": [Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  23. { "from": "start", "port": "next", "to": "enough" },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  24. { "from": "enough", "port": "body", "to": "order" },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  25. { "from": "order", "port": "next", "to": "deliver" },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  26. { "from": "deliver", "port": "next", "to": "enough" },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  27. { "from": "enough", "port": "done", "to": "price" },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  28. { "from": "price", "port": "next", "to": "large" },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  29. { "from": "large", "port": "true", "to": "big" },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  30. { "from": "large", "port": "false", "to": "small" },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  31. { "from": "big", "port": "next", "to": "say" },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  32. { "from": "small", "port": "next", "to": "say" },Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  33. { "from": "say", "port": "next", "to": "done" }Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  34. ]Zamknięcie struktury otwartej we wcześniejszych liniach.
  35. }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

Otwórz cały rozdział ze źródłem →
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.

  1. { "id": "start", "kind": "trigger", "event": "stock.low" }Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
CechaWartość
Parametry / typyevent
Wynikport next
Wymaganiabez krawędzi wejściowych
Ograniczenia—
Możliwe błędyKCS-FLW-0005
Wprowadzonoir/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.

  1. { "id": "a", "kind": "assign", "variable": "stock", "expression": "stock + 4" }Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
CechaWartość
Parametry / typyvariable, expression
Wyniknext
Wymagania—
Ograniczenia—
Możliwe błędyKCS-FLW-0013/0014
Wprowadzonoir/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.

  1. { "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.
CechaWartość
Parametry / typycall, arguments, variable
Wyniknext, opcjonalnie error
Wymaganiafunkcja istnieje (sprawdza kompilator)
Ograniczeniafunkcje ochronne zakazane
Możliwe błędyKCS-FLW-0010, KCS-KRS-1003
Wprowadzonoir/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.

  1. { "id": "large", "kind": "condition", "expression": "cost > 100" }Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  2. { "id": "enough", "kind": "loop", "expression": "stock < 10" }Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
CechaWartość
Parametry / typyexpression (Bool)
Wyniktrue/false; body/done
Wymaganiacykl tylko przez body
Ograniczenia—
Możliwe błędyKCS-FLW-0006
Wprowadzonoir/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.

  1. { "id": "w", "kind": "delay", "durationMs": 500 }Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  2. { "id": "done", "kind": "end", "expression": "toString(stock)" }Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
CechaWartość
Parametry / typywg bloku
Wyniknext / brak
Wymagania—
Ograniczeniaflow.checkpoint odrzucany przez broker pluginów
Możliwe błędyKCS-FLW-0016
Wprowadzonoir/2
Otwórz cały rozdział ze źródłem →
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):

  1. kret check . --json — w wyniku: "succeeded": true
  2. kret flow to-krets Flow/Restock.kflow — w wyniku: @flow
  3. kret flow blocks — w wyniku: kretflow-blocks

Wynik tej rundy: PASS — zob. EXPECTED_OUTPUT.txt.

Otwórz cały rozdział ze źródłem →

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

Porównujemy zapis z referencją. To ćwiczenie nie jest walidatorem programu.
Które podsumowanie jest zgodne z lekcją?

To quiz o opisanym kontrakcie. Nie kompiluje kodu, nie potwierdza wykonania programu i nie przyznaje nagród.

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 →

Wybierz, co możemy zapamiętać w tej przeglądarce. Możesz zmienić decyzję w każdej chwili.

Polityka prywatności