Przejdź do treści

KRET LANGUAGE ACADEMY · DOKUMENTACJA ZE ŹRÓDEŁ

Kontrakty typów i diagnostyka

ADVANCED40 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.
  • Porównaj TestsAndDiagnostics z AsyncStreamsEvents. Zidentyfikuj kontrolę typów, oczekiwany błąd i ograniczenie wykonania; nie zastępuj błędu przypadkowym poprawnym wynikiem.
Wymagania wstępne
  • Ukończ Podstawy i wcześniejszy poziom tej ścieżki.

Wyjaśnienie krok po kroku

Zaawansowane przykłady obejmują klasy, interfejsy, generyki oraz async/strumienie/zdarzenia wyłącznie w zamrożonym zakresie KretS 2.0. Nazwa podobna do innego języka nie oznacza identycznej semantyki. Czytaj ograniczenia przy konstrukcji i osobno oceniaj bramki hosta.

Praca z kodem źródłowym

Zadania, strumienie i zdarzenia [2.0]

`async fn` i `await` (zadania współbieżne, nie równoległe), `Stream<Int>` z buforem i `for await`, `timeout` obsłużony w `try`/`catch`, deklaracja `event`, handler `on`, `emit` oraz `subscribe … with`.

module Main

// Deklaracja zdarzenia: nazwa z kropkami i typowane argumenty.
event order.placed(amount: Int)

async fn produce(target: Stream<Int>, count: Int) {
    for i in range(1, count + 1) {
        await target.send(i * i)
    }
    target.close()
}

async fn slow(ms: Int) -> Int {
    await delay(milliseconds(ms))
    return ms
}

// Handler zdarzenia (może leżeć w dowolnym module pluginu).
on order.placed(amount: Int) {
    log.info("handler: zamówienie " + toString(amount))
}

// Dodatkowy subskrybent o zgodnej sygnaturze, dołączany i odłączany w czasie działania.
fn extra(amount: Int) {
    log.info("subskrybent: zamówienie " + toString(amount))
}

fn Start() -> String {
    let first = slow(20)
    let second = slow(30)
    let sum = await first + await second

    let squares: Stream<Int> = stream(2)
    produce(squares, 4)
    var total = 0
    for await value in squares {
        total = total + value
    }

    var late = "nie"
    try {
        let never = await timeout(milliseconds(10), slow(500))
        late = toString(never)
    } catch problem {
        late = "przekroczony"
    }

    subscribe order.placed with extra
    emit order.placed(5)
    unsubscribe order.placed with extra
    emit order.placed(1)

    return "zadania " + toString(sum) + "; strumień " + toString(total) + "; limit " + late
}

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. // Deklaracja zdarzenia: nazwa z kropkami i typowane argumenty.Komentarz autora; nie jest wykonywany.
  4. event order.placed(amount: Int)Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  5. Pusta linia oddziela fragmenty źródła.
  6. async fn produce(target: Stream<Int>, count: Int) {Sygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.
  7. for i in range(1, count + 1) {Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.
  8. await target.send(i * i)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. target.close()Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  11. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  12. Pusta linia oddziela fragmenty źródła.
  13. async fn slow(ms: Int) -> Int {Sygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.
  14. await delay(milliseconds(ms))Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  15. return msZwrócenie wartości z funkcji; nie jest zapisem do dziennika.
  16. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  17. Pusta linia oddziela fragmenty źródła.
  18. // Handler zdarzenia (może leżeć w dowolnym module pluginu).Komentarz autora; nie jest wykonywany.
  19. on order.placed(amount: Int) {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  20. log.info("handler: zamówienie " + toString(amount))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. Pusta linia oddziela fragmenty źródła.
  23. // Dodatkowy subskrybent o zgodnej sygnaturze, dołączany i odłączany w czasie działania.Komentarz autora; nie jest wykonywany.
  24. fn extra(amount: Int) {Sygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.
  25. log.info("subskrybent: zamówienie " + toString(amount))Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  26. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  27. Pusta linia oddziela fragmenty źródła.
  28. fn Start() -> String {Sygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.
  29. let first = slow(20)Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
  30. let second = slow(30)Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
  31. let sum = await first + await secondWiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
  32. Pusta linia oddziela fragmenty źródła.
  33. let squares: Stream<Int> = stream(2)Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
  34. produce(squares, 4)Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  35. var total = 0Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
  36. for await value in squares {Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.
  37. total = total + valueOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  38. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  39. Pusta linia oddziela fragmenty źródła.
  40. var late = "nie"Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
  41. try {Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.
  42. let never = await timeout(milliseconds(10), slow(500))Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
  43. late = toString(never)Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  44. } catch problem {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  45. late = "przekroczony"Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  46. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  47. Pusta linia oddziela fragmenty źródła.
  48. subscribe order.placed with extraOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  49. emit order.placed(5)Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  50. unsubscribe order.placed with extraOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  51. emit order.placed(1)Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  52. Pusta linia oddziela fragmenty źródła.
  53. return "zadania " + toString(sum) + "; strumień " + toString(total) + "; limit " + lateZwrócenie wartości z funkcji; nie jest zapisem do dziennika.
  54. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  55. Pusta linia oddziela fragmenty źródła.
  56. fn Shutdown() {Sygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.
  57. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  58. Pusta linia oddziela fragmenty źródła.

Oczekiwany wynik: „zadania 50; strumień 30; limit przekroczony”; w dzienniku dwa wpisy handlera i jeden wpis subskrybenta (po `unsubscribe` subskrybent nie dostaje drugiego zdarzenia).

Typowy błąd: Oczekiwanie równoległości: wszystkie zadania jednej maszyny działają na jednym wątku. Maszyna wykrywa zakleszczenie (wszystkie zadania czekają) i zgłasza błąd.

Instrukcja, wersje i zapisane wyniki →

Klasy, interfejsy, dziedziczenie, generyki [2.0]

Interfejs, klasa z konstruktorem `init`, dziedziczenie z `super(...)` i `override`, klasa generyczna `Pair<A, B>`, funkcja generyczna z ograniczeniem `T: Shape`, polimorfizm przez interfejs. Kod bazuje na oficjalnym przykładzie SDK `ObjectOriented`.

module Main

interface Shape {
    fn area() -> Int
    fn name() -> String
}

class Rect : Shape {
    width: Int
    height: Int
    init(width: Int, height: Int) {
        this.width = width
        this.height = height
    }
    fn area() -> Int {
        return this.width * this.height
    }
    fn name() -> String {
        return "prostokąt"
    }
}

class Square : Rect {
    init(side: Int) {
        super(side, side)
    }
    override fn name() -> String {
        return "kwadrat"
    }
}

class Pair<A, B> {
    first: A
    second: B
    init(first: A, second: B) {
        this.first = first
        this.second = second
    }
    fn swap() -> Pair<B, A> {
        return Pair(this.second, this.first)
    }
}

fn largest<T: Shape>(items: List<T>) -> T {
    var best = items.get(0)
    for item in items {
        if item.area() > best.area() {
            best = item
        }
    }
    return best
}

fn Start() -> String {
    let shapes: List<Shape> = [Rect(2, 3), Square(4), Rect(1, 10)]
    let biggest = largest(shapes)
    let pair = Pair("pole", biggest.area()).swap()
    var kinds: List<String> = []
    for s in shapes {
        if s is Square {
            kinds.add("Square")
        } else {
            kinds.add("Rect")
        }
    }
    return biggest.name() + " " + toString(pair.first) + " (" + pair.second + "); typy: " + kinds.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. interface Shape {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  4. fn area() -> IntSygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.
  5. fn name() -> StringSygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.
  6. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  7. Pusta linia oddziela fragmenty źródła.
  8. class Rect : Shape {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  9. width: IntOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  10. height: IntOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  11. init(width: Int, height: Int) {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  12. this.width = widthOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  13. this.height = heightOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  14. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  15. fn area() -> Int {Sygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.
  16. return this.width * this.heightZwrócenie wartości z funkcji; nie jest zapisem do dziennika.
  17. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  18. fn name() -> String {Sygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.
  19. return "prostokąt"Zwrócenie wartości z funkcji; nie jest zapisem do dziennika.
  20. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  21. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  22. Pusta linia oddziela fragmenty źródła.
  23. class Square : Rect {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  24. init(side: Int) {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  25. super(side, side)Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  26. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  27. override fn name() -> String {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  28. return "kwadrat"Zwrócenie wartości z funkcji; nie jest zapisem do dziennika.
  29. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  30. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  31. Pusta linia oddziela fragmenty źródła.
  32. class Pair<A, B> {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  33. first: AOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  34. second: BOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  35. init(first: A, second: B) {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  36. this.first = firstOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  37. this.second = secondOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  38. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  39. fn swap() -> Pair<B, A> {Sygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.
  40. return Pair(this.second, this.first)Zwrócenie wartości z funkcji; nie jest zapisem do dziennika.
  41. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  42. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  43. Pusta linia oddziela fragmenty źródła.
  44. fn largest<T: Shape>(items: List<T>) -> T {Sygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.
  45. var best = items.get(0)Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
  46. for item in items {Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.
  47. if item.area() > best.area() {Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.
  48. best = itemOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  49. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  50. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  51. return bestZwrócenie wartości z funkcji; nie jest zapisem do dziennika.
  52. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  53. Pusta linia oddziela fragmenty źródła.
  54. fn Start() -> String {Sygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.
  55. let shapes: List<Shape> = [Rect(2, 3), Square(4), Rect(1, 10)]Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
  56. let biggest = largest(shapes)Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
  57. let pair = Pair("pole", biggest.area()).swap()Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
  58. var kinds: List<String> = []Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
  59. for s in shapes {Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.
  60. if s is Square {Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.
  61. kinds.add("Square")Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  62. } else {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  63. kinds.add("Rect")Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  64. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  65. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  66. return biggest.name() + " " + toString(pair.first) + " (" + pair.second + "); typy: " + kinds.join(",")Zwrócenie wartości z funkcji; nie jest zapisem do dziennika.
  67. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  68. Pusta linia oddziela fragmenty źródła.
  69. fn Shutdown() {Sygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.
  70. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  71. Pusta linia oddziela fragmenty źródła.

Oczekiwany wynik: „kwadrat 16 (pole); typy: Rect,Square,Rect” oraz listing bytecode z funkcją `Start`.

Typowy błąd: Nadpisanie metody bez `override` albo próba przeciążenia funkcji (nazwy funkcji są unikalne) — błąd kompilacji.

Instrukcja, wersje i zapisane wyniki →

Testy `kret test` i diagnostyka (EXPERIMENTAL)

Moduły testowe w `Tests/` (funkcje `test…` bez parametrów i bez wyniku). Porażka = `throw`, pominięcie = `throw "SKIP: …"`. `kret test --list` tylko kompiluje i wypisuje plan, `kret test --json` wykonuje każdy moduł w świeżym, izolowanym procesie pluginu. `kret test` ma status EXPERIMENTAL (`kret-test/1`).

module Main

fn clamp(value: Int, low: Int, high: Int) -> Int {
    if value < low {
        return low
    }
    if value > high {
        return high
    }
    return value
}

fn Start() -> Int {
    return clamp(150, 0, 100)
}

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 clamp(value: Int, low: Int, high: Int) -> Int {Sygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.
  4. if value < low {Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.
  5. return lowZwrócenie wartości z funkcji; nie jest zapisem do dziennika.
  6. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  7. if value > high {Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.
  8. return highZwrócenie wartości z funkcji; nie jest zapisem do dziennika.
  9. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  10. return valueZwrócenie wartości z funkcji; nie jest zapisem do dziennika.
  11. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  12. Pusta linia oddziela fragmenty źródła.
  13. fn Start() -> Int {Sygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.
  14. return clamp(150, 0, 100)Zwrócenie wartości z funkcji; nie jest zapisem do dziennika.
  15. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  16. Pusta linia oddziela fragmenty źródła.
  17. fn Shutdown() {Sygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.
  18. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  19. Pusta linia oddziela fragmenty źródła.

Oczekiwany wynik: Plan zawiera 3 testy; przebieg: 2 × PASS, 1 × SKIP, status `PASSED` (kod 0). `run` zwraca 100.

Typowy błąd: Funkcja `testX(x: Int)` z parametrem nie jest testem — dostaje status ERROR. Brak testów albo pusty filtr to `NO_TESTS` (kod 6), który **nie jest sukcesem**.

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 — zgodność i wersje / compatibility and versions

KretS — zgodność i wersje / compatibility and versions

Polski

  • 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).
Otwórz cały rozdział ze źródłem →
KretS — kody diagnostyczne / diagnostic codes

KretS — kody diagnostyczne / diagnostic codes

Kod / codePolski
KCS-KRS-0101…0331błędy składni i typów (znaczenie kodów KRSxxxx z 1.0 zachowane)
KCS-KRS-0307null/pusta lista bez znanego typu
KCS-KRS-0320operator wymaga tych samych typów (brak konwersji niejawnych)
KCS-KRS-0322wartość T? może być null — użyj unwrap/orElse
KCS-KRS-1003nieznana nazwa
KCS-KRS-1010nieznany moduł hosta (np. Kret.Hardware w starszym SDK)
KCS-KRS-1012przekroczony limit kompilatora (funkcje, rekordy, zagnieżdżenie)
KCS-KRS-1028 / 1029emit nieznanego zdarzenia / const nie-literał
KCS-VM-0001 / 0002 / 0006 / 0007dzielenie przez zero / przepełnienie / złe rzutowanie / wynik nieskończony
KCS-PERM-*odmowa brokera (brak przyznania)

Format: kret-diagnostics/1 (kod, plik, wiersz, kolumna, zakres) / (code, file, line, column, range).

Otwórz cały rozdział ze źródłem →
KretS — bezpieczeństwo / security

KretS — bezpieczeństwo / security

Polski

  • Każda operacja hosta przechodzi przez Security Broker i KCS przy każdym wywołaniu.
  • Kod nie ma dostępu do plików, sieci, procesów ani SQL.
  • Proces pluginu: Job Object + ograniczony token; --isolation appcontainer / Core: AppContainer.
  • Narzędzia KretAI działają z uprawnieniami swojej deklaracji, nie agenta.
  • Limity zasobów nie są przechwytywalne przez try/catch.
Otwórz cały rozdział ze źródłem →
KretS — rozwiązywanie problemów / troubleshooting

KretS — rozwiązywanie problemów / troubleshooting

Problem (PL)Rozwiązanie (PL)
KCS-KRS-0320 przy 1 + 2.0jawna konwersja: toFloat(1) + 2.0
KCS-KRS-0322 przy parseInt(x).isOkparseInt zwraca Int64? — orElse(parseInt(x), -1)
odmowa KCS-PERM-… w czasie runuprawnienie w manifeście + przyznanie w polityce hosta (--policy)
test „nie jest testem”funkcja test… bez parametrów, bez wyniku, w Tests/
Zadania „zawieszają się”wszystkie zadania czekają = zakleszczenie (błąd maszyny); użyj timeout
Otwórz cały rozdział ze źródłem →
KretS — samouczek ADVANCED

KretS — samouczek ADVANCED

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: integracja z Core i innymi językami, KretDB, bezpieczny dostęp do API, pluginy, stan, testy, diagnostyka, uprawnienia.

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. Zadania, strumienie i zdarzenia [2.0] (KRETS-A02-AsyncStreamsEvents)

Projekt: ../../Examples/ADVANCED_AsyncStreamsEvents/ · 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: 30; limit przekroczony

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

2. Klasy, interfejsy, dziedziczenie, generyki [2.0] (KRETS-A01-ClassesInterfacesGenerics)

Projekt: ../../Examples/ADVANCED_ClassesInterfacesGenerics/ · 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: kwadrat 16
  3. kret disasm . — w wyniku: Start

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

3. Testy kret test i diagnostyka (EXPERIMENTAL) (KRETS-A03-TestsAndDiagnostics)

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

Kroki (katalog roboczy: katalog przykładu):

  1. kret test . --list — w wyniku: testClampEdges
  2. kret test . --json --data {DATA} --report {OUT}/report.json --junit {OUT}/junit.xml — w wyniku: "PASSED"
  3. kret run . --policy host-policy.json --data {DATA} — w wyniku: 100

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

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

Ćwiczenie i sprawdzenie wiedzy

Porównaj TestsAndDiagnostics z AsyncStreamsEvents. Zidentyfikuj kontrolę typów, oczekiwany błąd i ograniczenie wykonania; nie zastępuj błędu przypadkowym poprawnym wynikiem.

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. Zaawansowane przykłady obejmują klasy, interfejsy, generyki oraz async/strumienie/zdarzenia wyłącznie w zamrożonym zakresie KretS 2.0. Nazwa podobna do innego języka nie oznacza identycznej semantyki. Czytaj ograniczenia przy konstrukcji i osobno oceniaj bramki hosta.

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

Zaawansowane przykłady obejmują klasy, interfejsy, generyki oraz async/strumienie/zdarzenia wyłącznie w zamrożonym zakresie KretS 2.0. Nazwa podobna do innego języka nie oznacza identycznej semantyki. Czytaj ograniczenia przy konstrukcji i osobno oceniaj bramki hosta.

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