KRET LANGUAGE ACADEMY · DOKUMENTACJA ZE ŹRÓDEŁ
Dane, sterowanie i moduły
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.
module MainDeklaracja modułu KretS; porównaj nazwę z nazwą pliku.Pusta linia oddziela fragmenty źródła.const LIMIT: Int = 100Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.Pusta linia oddziela fragmenty źródła.record Order {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.customer: StringOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.amount: IntOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.}Zamknięcie struktury otwartej we wcześniejszych liniach.Pusta linia oddziela fragmenty źródła.// Zamienia wiersz "klient;kwota" na rekord. Zły wiersz kończy się wyjątkiem.Komentarz autora; nie jest wykonywany.fn parse(line: String) -> Order {Sygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.let parts = line.split(";")Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.if parts.size != 2 {Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.throw "zły wiersz: " + lineSterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.}Zamknięcie struktury otwartej we wcześniejszych liniach.// parseInt zwraca Int64? (null, gdy tekst nie jest liczbą) — orElse podaje wartość zastępczą.Komentarz autora; nie jest wykonywany.let amount = orElse(parseInt(parts.get(1).trim()), -1)Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.if amount < 0 {Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.throw "zła kwota: " + parts.get(1)Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.}Zamknięcie struktury otwartej we wcześniejszych liniach.return Order(customer = parts.get(0).trim(), amount = amount)Zwrócenie wartości z funkcji; nie jest zapisem do dziennika.}Zamknięcie struktury otwartej we wcześniejszych liniach.Pusta linia oddziela fragmenty źródła.fn Start() -> String {Sygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.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.var orders: List<Order> = []Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.var rejected = 0Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.for line in lines {Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.try {Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.orders.add(parse(line))Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.} catch problem {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.rejected = rejected + 1Odczytaj 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.var totals: Map<String, Int> = map()Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.var large = 0Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.for order in orders {Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.// Map.get zwraca V? — brak klucza to null.Komentarz autora; nie jest wykonywany.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.if order.amount > LIMIT {Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.large = large + 1Odczytaj 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.var parts: List<String> = []Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.for customer in totals {Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.parts.add(customer + "=" + toString(orElse(totals.get(customer), 0)))Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.}Zamknięcie struktury otwartej we wcześniejszych liniach.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.}Zamknięcie struktury otwartej we wcześniejszych liniach.Pusta linia oddziela fragmenty źródła.fn Shutdown() {Sygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.}Zamknięcie struktury otwartej we wcześniejszych liniach.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.
module MainDeklaracja modułu KretS; porównaj nazwę z nazwą pliku.Pusta linia oddziela fragmenty źródła.fn Start() -> String {Sygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.let values = [4, 8, 15, 16, 23, 42]Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.let summary = Stats.summarize(values)Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.return Text.banner("statystyki") + " " + Text.describe(summary)Zwrócenie wartości z funkcji; nie jest zapisem do dziennika.}Zamknięcie struktury otwartej we wcześniejszych liniach.Pusta linia oddziela fragmenty źródła.fn Shutdown() {Sygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.}Zamknięcie struktury otwartej we wcześniejszych liniach.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 / polecenie | Opis |
|---|---|
String | length 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, Stream | isOk value error; unixSeconds; cancel isCancelled; send close |
wbudowane / builtins | toString 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 |
CLI | kret build | run | test | debug | profile | disasm | lsp |
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
| Element | Stan w KretS |
|---|---|
| Struktura pliku | module 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 danych | Bool 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. |
| Zmienne | let (stała), var (zmienna), typ wnioskowany albo jawny let x: Int = 1. |
| Stałe modułu | const NAZWA: Typ = literał [2.0] — tylko literał. |
| Instrukcje | przypisanie, 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. |
| Funkcje | fn nazwa(p: T) -> R { … }, async fn, generyczne fn f<T: Ograniczenie>(…); nazwy unikalne (brak przeciążania). |
| Moduły i import | jeden 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ów | try { } 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ętestructi moduły API 1.0 (Kret.UI,Kret.Console). - Zmiana znaczenia konstrukcji 2.0 wymaga
krets-3.0. - SDK
sdk-infonadal raportujesyntax: PROVISIONALdla KretS — rozbieżność z LANGUAGE_FREEZE (zapisana w raporcie). - Kandydat rc.3+kret.local.3 dodaje
fromUnixSecondsi modułKret.Hardware(addytywnie).
Pełna referencja konstrukcji: SYNTAX_REFERENCE.md.
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):
kret check . --json— w wyniku:"succeeded": truekret 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):
kret check . --json— w wyniku:"succeeded": truekret run . --policy host-policy.json --data {DATA}— w wyniku:suma=108
Wynik tej rundy: PASS — zob. EXPECTED_OUTPUT.txt.
Ć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.
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 →