Przejdź do treści

KRET LANGUAGE ACADEMY · DOKUMENTACJA ZE ŹRÓDEŁ

Dane, sterowanie i moduły

INTERMEDIATE30 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.
  • Prześledź wejście i wynik DataProcessing. W Modules znajdź wywołanie między modułami i odróżnij nazwę modułu od ścieżki pliku.
Wymagania wstępne
  • Ukończ Podstawy i wcześniejszy poziom tej ścieżki.

Wyjaśnienie krok po kroku

Rekord opisuje nazwane pola danych. Warunek if/while ma typ Bool; for może przechodzić po kolekcji. Lista/mapa i granice wykonania mają własny kontrakt SDK. Rozdzielenie kodu na moduły ułatwia znalezienie zależności, ale nie zmienia uprawnień pluginu.

Praca z kodem źródłowym

Przetwarzanie danych: rekordy, listy, mapy, błędy

Parsowanie wierszy tekstu do rekordów (`record`), filtrowanie i sumowanie w pętli `for`, grupowanie w `Map<String, Int>`, typy nullable (`parseInt` → `Int64?`, `Map.get` → `V?`) z `orElse`, obsługa błędu `try`/`catch` i `throw`, stała `const`.

module Main

const LIMIT: Int = 100

record Order {
    customer: String
    amount: Int
}

// Zamienia wiersz "klient;kwota" na rekord. Zły wiersz kończy się wyjątkiem.
fn parse(line: String) -> Order {
    let parts = line.split(";")
    if parts.size != 2 {
        throw "zły wiersz: " + line
    }
    // parseInt zwraca Int64? (null, gdy tekst nie jest liczbą) — orElse podaje wartość zastępczą.
    let amount = orElse(parseInt(parts.get(1).trim()), -1)
    if amount < 0 {
        throw "zła kwota: " + parts.get(1)
    }
    return Order(customer = parts.get(0).trim(), amount = amount)
}

fn Start() -> String {
    let lines = ["ala; 30", "bob; 120", "ala; 45", "zły wiersz", "cecylia; x", "bob; 15"]
    var orders: List<Order> = []
    var rejected = 0
    for line in lines {
        try {
            orders.add(parse(line))
        } catch problem {
            rejected = rejected + 1
        }
    }
    var totals: Map<String, Int> = map()
    var large = 0
    for order in orders {
        // Map.get zwraca V? — brak klucza to null.
        totals.set(order.customer, orElse(totals.get(order.customer), 0) + order.amount)
        if order.amount > LIMIT {
            large = large + 1
        }
    }
    var parts: List<String> = []
    for customer in totals {
        parts.add(customer + "=" + toString(orElse(totals.get(customer), 0)))
    }
    return "przyjęte " + toString(orders.size) + ", odrzucone " + toString(rejected) + ", duże " + toString(large) + "; " + parts.join(", ")
}

fn Shutdown() {
}

Czytanie kodu linia po linii

Objaśnienia struktury nie są walidacją semantyczną. Szczegółowy kontrakt opisują referencje i README przykładu.

  1. module MainDeklaracja modułu KretS; porównaj nazwę z nazwą pliku.
  2. Pusta linia oddziela fragmenty źródła.
  3. const LIMIT: Int = 100Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
  4. Pusta linia oddziela fragmenty źródła.
  5. record Order {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  6. customer: StringOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  7. amount: IntOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  8. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  9. Pusta linia oddziela fragmenty źródła.
  10. // Zamienia wiersz "klient;kwota" na rekord. Zły wiersz kończy się wyjątkiem.Komentarz autora; nie jest wykonywany.
  11. fn parse(line: String) -> Order {Sygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.
  12. let parts = line.split(";")Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
  13. if parts.size != 2 {Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.
  14. throw "zły wiersz: " + lineSterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.
  15. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  16. // parseInt zwraca Int64? (null, gdy tekst nie jest liczbą) — orElse podaje wartość zastępczą.Komentarz autora; nie jest wykonywany.
  17. let amount = orElse(parseInt(parts.get(1).trim()), -1)Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
  18. if amount < 0 {Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.
  19. throw "zła kwota: " + parts.get(1)Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.
  20. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  21. return Order(customer = parts.get(0).trim(), amount = amount)Zwrócenie wartości z funkcji; nie jest zapisem do dziennika.
  22. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  23. Pusta linia oddziela fragmenty źródła.
  24. fn Start() -> String {Sygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.
  25. let lines = ["ala; 30", "bob; 120", "ala; 45", "zły wiersz", "cecylia; x", "bob; 15"]Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
  26. var orders: List<Order> = []Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
  27. var rejected = 0Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
  28. for line in lines {Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.
  29. try {Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.
  30. orders.add(parse(line))Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  31. } catch problem {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  32. rejected = rejected + 1Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  33. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  34. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  35. var totals: Map<String, Int> = map()Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
  36. var large = 0Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
  37. for order in orders {Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.
  38. // Map.get zwraca V? — brak klucza to null.Komentarz autora; nie jest wykonywany.
  39. totals.set(order.customer, orElse(totals.get(order.customer), 0) + order.amount)Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  40. if order.amount > LIMIT {Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.
  41. large = large + 1Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  42. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  43. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  44. var parts: List<String> = []Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
  45. for customer in totals {Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.
  46. parts.add(customer + "=" + toString(orElse(totals.get(customer), 0)))Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  47. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  48. return "przyjęte " + toString(orders.size) + ", odrzucone " + toString(rejected) + ", duże " + toString(large) + "; " + parts.join(", ")Zwrócenie wartości z funkcji; nie jest zapisem do dziennika.
  49. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  50. Pusta linia oddziela fragmenty źródła.
  51. fn Shutdown() {Sygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.
  52. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  53. Pusta linia oddziela fragmenty źródła.

Oczekiwany wynik: „przyjęte 4, odrzucone 2, duże 1; ala=75, bob=135” — mapa jest przechodzona po kluczach rosnąco (deterministycznie).

Typowy błąd: Odczyt `.isOk`/`.value` albo arytmetyka na wartości `Int64?` bez `orElse`/`unwrap` → `KCS-KRS-0322` / `KCS-KRS-0320` (sprawdzone w tej rundzie eksportu).

Instrukcja, wersje i zapisane wyniki →

Moduły i łączenie funkcji

Jeden plik = jeden moduł. `Main` wywołuje funkcje modułów `Stats` i `Text` przez `Moduł.funkcja`. Rekordy są wspólne dla całego pluginu.

module Main

fn Start() -> String {
    let values = [4, 8, 15, 16, 23, 42]
    let summary = Stats.summarize(values)
    return Text.banner("statystyki") + " " + Text.describe(summary)
}

fn Shutdown() {
}

Czytanie kodu linia po linii

Objaśnienia struktury nie są walidacją semantyczną. Szczegółowy kontrakt opisują referencje i README przykładu.

  1. module MainDeklaracja modułu KretS; porównaj nazwę z nazwą pliku.
  2. Pusta linia oddziela fragmenty źródła.
  3. fn Start() -> String {Sygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.
  4. let values = [4, 8, 15, 16, 23, 42]Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
  5. let summary = Stats.summarize(values)Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
  6. return Text.banner("statystyki") + " " + Text.describe(summary)Zwrócenie wartości z funkcji; nie jest zapisem do dziennika.
  7. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  8. Pusta linia oddziela fragmenty źródła.
  9. fn Shutdown() {Sygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.
  10. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  11. Pusta linia oddziela fragmenty źródła.

Oczekiwany wynik: „[STATYSTYKI] n=6 suma=108 min=4 max=42”.

Typowy błąd: Nazwa modułu inna niż nazwa pliku albo moduł projektu o tej samej nazwie co moduł biblioteki KretLib — błąd kompilacji.

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.

KretS — API / CLI

KretS — API / CLI

Polski

API / polecenieOpis
Stringlength contains startsWith endsWith upper lower trim split replace substring indexOf
List<T>size add get set removeAt contains clear first last join
Map<K,V>size get set has remove keys values clear (klucz String, Int64, Int32, UUID)
Result<T,E>, Instant, Task, StreamisOk value error; unixSeconds; cancel isCancelled; send close
wbudowane / builtinstoString parseInt parseFloat parseUuid toFloat toInt round toInt32 toInt64 toDecimal format len range min max abs now secondsBetween addSeconds fromUnixSeconds orElse unwrap ok err list map toPercentage toTemperature milliseconds seconds toMilliseconds delay timeout stream cancelled
db.* (Kret.DB)get getOr set delete exists begin commit rollback + nazwane zapytania — uprawnienia kretdb.*
config.* (Kret.Config)getString getInt getFloat getBool — sekrety zawsze odmawiane
ai.ask (Kret.Ai)ai.ask(agent, polecenie) — kretai.use, kretai.model.use; prawdziwy model NOT_RUN
CLIkret build | run | test | debug | profile | disasm | lsp
Otwórz cały rozdział ze źródłem →
KretS — specyfikacja (zakres kontraktu 1.0)

KretS — specyfikacja (zakres kontraktu 1.0)

Status 1.0: `FROZEN_SUPPORTED_SUBSET` — zamrożony dokładnie opisany zakres; reszta poza kontraktem 1.0. Gramatyka/wersja: krets-2.0. 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/03_KRETS_SPECIFICATION.md
  • SDK 04_Languages/KretS/SPEC.md
  • SDK 03_Runtime/README.md
  • SDK 10_SDK/KRET_TEST.md

Elementy języka

ElementStan w KretS
Struktura plikumodule Nazwa w pierwszym wierszu, potem use, const, record, class, interface, event, handlery on, funkcje fn.
Rozszerzenie.krs (KretScript 1.0 miał .kret — legacy).
Komentarze// …, /* … */.
Typy danychBool Int32 Int64 Float64 Decimal String Bytes UUID Instant Duration Percentage Temperature Unit, List<T>, Map<K,V>, T?, Result<T,E>, Task<T>, Stream<T>, Any, rekordy, klasy, interfejsy; aliasy Int, Float, Timestamp.
Zmiennelet (stała), var (zmienna), typ wnioskowany albo jawny let x: Int = 1.
Stałe modułuconst NAZWA: Typ = literał [2.0] — tylko literał.
Instrukcjeprzypisanie, if/else if/else, for … in, for await … in, while, break, continue, return, try/catch, throw, emit, subscribe/unsubscribe … with, blok, wywołanie. Jedna instrukcja w wierszu (kilka: ;).
Operatory|| && == != < <= > >= + - * / % ! - (unarny), await, as, is; &&/|| skracają obliczenie.
Funkcjefn nazwa(p: T) -> R { … }, async fn, generyczne fn f<T: Ograniczenie>(…); nazwy unikalne (brak przeciążania).
Moduły i importjeden plik = jeden moduł; Moduł.funkcja; use Kret.DB as db, use Kret.Config as config, use Kret.Ai as ai, use Kret.Bridge.<usługa> as x; log bez use.
Obsługa błędówtry { } catch e { } (e: String) przechwytuje throw, błędy wykonania, odmowy KCS-PERM-…, timeout, anulowanie zadania. Nieprzechwytywalne: limity zasobów, anulowanie przez hosta.
Asynchronicznośćasync fn, await, Task<T> (cancel, isCancelled), timeout(d, task), delay(d), Stream<T> (stream(n), send, close, for await). Współbieżność na jednym wątku.

Zakres poza kontraktem / ograniczenia

  • kod natywny / dostęp do plików i sieci — KretS nie ma takich API (KretBridge jest PROVISIONAL i zablokowany w Core)
  • równoległe obliczenia wielowątkowe (zadania są współbieżne na jednym wątku)
  • kod KretScript 1.0 (.kret) — nie jest przepisywany automatycznie
  • Kontrakt: krets-2.0, KBC 2 (format 1 nadal czytany).
  • KretScript 1.0 (.kret) — LEGACY_COMPATIBILITY, bez automatycznej migracji; usunięte struct i moduły API 1.0 (Kret.UI, Kret.Console).
  • Zmiana znaczenia konstrukcji 2.0 wymaga krets-3.0.
  • SDK sdk-info nadal raportuje syntax: PROVISIONAL dla KretS — rozbieżność z LANGUAGE_FREEZE (zapisana w raporcie).
  • Kandydat rc.3+kret.local.3 dodaje fromUnixSeconds i moduł Kret.Hardware (addytywnie).

Pełna referencja konstrukcji: SYNTAX_REFERENCE.md.

Otwórz cały rozdział ze źródłem →
KretS — samouczek INTERMEDIATE

KretS — samouczek INTERMEDIATE

Status 1.0: `FROZEN_SUPPORTED_SUBSET` — zamrożony dokładnie opisany zakres; reszta poza kontraktem 1.0. Gramatyka/wersja: krets-2.0. 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. Przetwarzanie danych: rekordy, listy, mapy, błędy (KRETS-I01-DataProcessing)

Projekt: ../../Examples/INTERMEDIATE_DataProcessing/ · klasyfikacja RUNNABLE_LOCAL · Playground LOCAL_EXECUTE

Kroki (katalog roboczy: katalog przykładu):

  1. kret check . --json — w wyniku: "succeeded": true
  2. kret run . --policy host-policy.json --data {DATA} — w wyniku: odrzucone 2

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

2. Moduły i łączenie funkcji (KRETS-I02-Modules)

Projekt: ../../Examples/INTERMEDIATE_Modules/ · klasyfikacja RUNNABLE_LOCAL · Playground LOCAL_EXECUTE

Kroki (katalog roboczy: katalog przykładu):

  1. kret check . --json — w wyniku: "succeeded": true
  2. kret run . --policy host-policy.json --data {DATA} — w wyniku: suma=108

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

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

Ćwiczenie i sprawdzenie wiedzy

Prześledź wejście i wynik DataProcessing. W Modules znajdź wywołanie między modułami i odróżnij nazwę modułu od ścieżki pliku.

Szkic nie jest wysyłany na serwer i znika po opuszczeniu lekcji. Przed wyjściem możesz go skopiować.
Podpowiedzi
  • KretS (oficjalnie KretScript, generacja 2.0) to statycznie typowany język logiki pluginów. Kompiluje się do bytecode KBC 2 i działa w maszynie z weryfikatorem w osobnym procesie pluginu. Operacje hosta (dziennik, KretDB, konfiguracja, AI, mosty) są dostępne tylko przez brokera i tylko przy uprawnieniu z KretL.
  • 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. Rekord opisuje nazwane pola danych. Warunek if/while ma typ Bool; for może przechodzić po kolekcji. Lista/mapa i granice wykonania mają własny kontrakt SDK. Rozdzielenie kodu na moduły ułatwia znalezienie zależności, ale nie zmienia uprawnień pluginu.

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

Rekord opisuje nazwane pola danych. Warunek if/while ma typ Bool; for może przechodzić po kolekcji. Lista/mapa i granice wykonania mają własny kontrakt SDK. Rozdzielenie kodu na moduły ułatwia znalezienie zależności, ale nie zmienia uprawnień pluginu.

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