KRET LANGUAGE ACADEMY · DOKUMENTACJA ZE ŹRÓDEŁ
Kontrakty typów i diagnostyka
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.
module MainDeklaracja modułu KretS; porównaj nazwę z nazwą pliku.Pusta linia oddziela fragmenty źródła.// Deklaracja zdarzenia: nazwa z kropkami i typowane argumenty.Komentarz autora; nie jest wykonywany.event order.placed(amount: Int)Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.Pusta linia oddziela fragmenty źródła.async fn produce(target: Stream<Int>, count: Int) {Sygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.for i in range(1, count + 1) {Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.await target.send(i * i)Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.}Zamknięcie struktury otwartej we wcześniejszych liniach.target.close()Odczytaj 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.async fn slow(ms: Int) -> Int {Sygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.await delay(milliseconds(ms))Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.return msZwró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.// Handler zdarzenia (może leżeć w dowolnym module pluginu).Komentarz autora; nie jest wykonywany.on order.placed(amount: Int) {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.log.info("handler: zamówienie " + toString(amount))Odczytaj 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.// Dodatkowy subskrybent o zgodnej sygnaturze, dołączany i odłączany w czasie działania.Komentarz autora; nie jest wykonywany.fn extra(amount: Int) {Sygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.log.info("subskrybent: zamówienie " + toString(amount))Odczytaj 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.fn Start() -> String {Sygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.let first = slow(20)Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.let second = slow(30)Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.let sum = await first + await secondWiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.Pusta linia oddziela fragmenty źródła.let squares: Stream<Int> = stream(2)Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.produce(squares, 4)Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.var total = 0Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.for await value in squares {Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.total = total + valueOdczytaj 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.var late = "nie"Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.try {Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.let never = await timeout(milliseconds(10), slow(500))Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.late = toString(never)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.late = "przekroczony"Odczytaj 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.subscribe order.placed with extraOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.emit order.placed(5)Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.unsubscribe order.placed with extraOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.emit order.placed(1)Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.Pusta linia oddziela fragmenty źródła.return "zadania " + toString(sum) + "; strumień " + toString(total) + "; limit " + lateZwró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: „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.
module MainDeklaracja modułu KretS; porównaj nazwę z nazwą pliku.Pusta linia oddziela fragmenty źródła.interface Shape {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.fn area() -> IntSygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.fn name() -> StringSygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.}Zamknięcie struktury otwartej we wcześniejszych liniach.Pusta linia oddziela fragmenty źródła.class Rect : Shape {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.width: IntOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.height: IntOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.init(width: Int, height: Int) {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.this.width = widthOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.this.height = heightOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.}Zamknięcie struktury otwartej we wcześniejszych liniach.fn area() -> Int {Sygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.return this.width * this.heightZwrócenie wartości z funkcji; nie jest zapisem do dziennika.}Zamknięcie struktury otwartej we wcześniejszych liniach.fn name() -> String {Sygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.return "prostokąt"Zwrócenie wartości z funkcji; nie jest zapisem do dziennika.}Zamknięcie struktury otwartej we wcześniejszych liniach.}Zamknięcie struktury otwartej we wcześniejszych liniach.Pusta linia oddziela fragmenty źródła.class Square : Rect {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.init(side: Int) {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.super(side, side)Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.}Zamknięcie struktury otwartej we wcześniejszych liniach.override fn name() -> String {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.return "kwadrat"Zwrócenie wartości z funkcji; nie jest zapisem do dziennika.}Zamknięcie struktury otwartej we wcześniejszych liniach.}Zamknięcie struktury otwartej we wcześniejszych liniach.Pusta linia oddziela fragmenty źródła.class Pair<A, B> {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.first: AOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.second: BOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.init(first: A, second: B) {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.this.first = firstOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.this.second = secondOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.}Zamknięcie struktury otwartej we wcześniejszych liniach.fn swap() -> Pair<B, A> {Sygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.return Pair(this.second, this.first)Zwrócenie wartości z funkcji; nie jest zapisem do dziennika.}Zamknięcie struktury otwartej we wcześniejszych liniach.}Zamknięcie struktury otwartej we wcześniejszych liniach.Pusta linia oddziela fragmenty źródła.fn largest<T: Shape>(items: List<T>) -> T {Sygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.var best = items.get(0)Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.for item in items {Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.if item.area() > best.area() {Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.best = itemOdczytaj 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.return bestZwró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 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.let biggest = largest(shapes)Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.let pair = Pair("pole", biggest.area()).swap()Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.var kinds: List<String> = []Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.for s in shapes {Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.if s is Square {Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.kinds.add("Square")Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.} else {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.kinds.add("Rect")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.return biggest.name() + " " + toString(pair.first) + " (" + pair.second + "); typy: " + kinds.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: „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.
module MainDeklaracja modułu KretS; porównaj nazwę z nazwą pliku.Pusta linia oddziela fragmenty źródła.fn clamp(value: Int, low: Int, high: Int) -> Int {Sygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.if value < low {Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.return lowZwrócenie wartości z funkcji; nie jest zapisem do dziennika.}Zamknięcie struktury otwartej we wcześniejszych liniach.if value > high {Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.return highZwrócenie wartości z funkcji; nie jest zapisem do dziennika.}Zamknięcie struktury otwartej we wcześniejszych liniach.return valueZwró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() -> Int {Sygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.return clamp(150, 0, 100)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: 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ę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).
KretS — kody diagnostyczne / diagnostic codes
KretS — kody diagnostyczne / diagnostic codes
| Kod / code | Polski |
|---|---|
KCS-KRS-0101…0331 | błędy składni i typów (znaczenie kodów KRSxxxx z 1.0 zachowane) |
KCS-KRS-0307 | null/pusta lista bez znanego typu |
KCS-KRS-0320 | operator wymaga tych samych typów (brak konwersji niejawnych) |
KCS-KRS-0322 | wartość T? może być null — użyj unwrap/orElse |
KCS-KRS-1003 | nieznana nazwa |
KCS-KRS-1010 | nieznany moduł hosta (np. Kret.Hardware w starszym SDK) |
KCS-KRS-1012 | przekroczony limit kompilatora (funkcje, rekordy, zagnieżdżenie) |
KCS-KRS-1028 / 1029 | emit nieznanego zdarzenia / const nie-literał |
KCS-VM-0001 / 0002 / 0006 / 0007 | dzielenie 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).
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.
KretS — rozwiązywanie problemów / troubleshooting
KretS — rozwiązywanie problemów / troubleshooting
| Problem (PL) | Rozwiązanie (PL) |
|---|---|
KCS-KRS-0320 przy 1 + 2.0 | jawna konwersja: toFloat(1) + 2.0 |
KCS-KRS-0322 przy parseInt(x).isOk | parseInt zwraca Int64? — orElse(parseInt(x), -1) |
odmowa KCS-PERM-… w czasie run | uprawnienie 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 |
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):
kret check . --json— w wyniku:"succeeded": truekret 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):
kret check . --json— w wyniku:"succeeded": truekret run . --policy host-policy.json --data {DATA}— w wyniku:kwadrat 16kret 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):
kret test . --list— w wyniku:testClampEdgeskret test . --json --data {DATA} --report {OUT}/report.json --junit {OUT}/junit.xml— w wyniku:"PASSED"kret run . --policy host-policy.json --data {DATA}— w wyniku:100
Wynik tej rundy: PASS — zob. EXPECTED_OUTPUT.txt.
Ć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.
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 →