KRET LANGUAGE ACADEMY · DOKUMENTACJA ZE ŹRÓDEŁ
Moduł, funkcja i typ wyniku
Czego się nauczysz
- Prześledź źródła i wyjaśnij opisany kontrakt.
- W HelloWorld znajdź moduł, sygnaturę i return. W CommonTypeErrors wskaż niezgodność typu bez zmieniania oczekiwanego wyniku testu.
Wymagania wstępne
- Ukończ Podstawy i wcześniejszy poziom tej ścieżki.
Wyjaśnienie krok po kroku
Plik Main.krs deklaruje module Main. fn Start() -> String zwraca tekst; return przekazuje wartość do wywołującego, nie jest zapisem do dziennika. let wiąże wartość lokalną, var pozwala ją zmieniać, const wymaga literału. Przy null i pustej kolekcji potrzebny jest znany typ.
Praca z kodem źródłowym
Najczęstsze błędy typów
KretS nie ma konwersji niejawnych. `1 + 2.0` daje `KCS-KRS-0320`, `let x = null` bez typu daje `KCS-KRS-0307`. Folder `fixed/` pokazuje poprawki: jawne `toFloat(1)` i typ `String?`.
module Main
fn Start() -> String {
let sum = toFloat(1) + 2.0
let nothing: String? = null
return toString(sum) + " / " + orElse(nothing, "brak")
}
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 sum = toFloat(1) + 2.0Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.let nothing: String? = nullWiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.return toString(sum) + " / " + orElse(nothing, "brak")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: Dwa pierwsze polecenia kończą się kodem 1 z diagnostyką w pliku `Script/Main.krs` (wiersz i kolumna). Wersja poprawiona zwraca „3.0 / brak” (`Float64` zawsze z kropką).
Typowy błąd: Oczekiwanie, że liczba całkowita „sama” zamieni się na zmiennoprzecinkową. Zawsze używaj `toFloat`, `toInt`, `toString`.
Instrukcja, wersje i zapisane wyniki →Pierwszy program KretS
Moduł `Main`, funkcja `Start` zwracająca `String`, zmienna `let`, łączenie tekstów i wpis w dzienniku (`log.info`, wymaga `logs.own.write`).
module Main
// Pierwszy program: zmienna, tekst, dziennik.
fn Start() -> String {
let name = "Kret"
log.info("Witaj, " + name + "!")
return "Witaj, " + name + "!"
}
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.// Pierwszy program: zmienna, tekst, dziennik.Komentarz autora; nie jest wykonywany.fn Start() -> String {Sygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.let name = "Kret"Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.log.info("Witaj, " + name + "!")Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.return "Witaj, " + name + "!"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: Wynik `start`: „Witaj, Kret!”, ten sam tekst w dzienniku pluginu.
Typowy błąd: Użycie `log.info` bez `logs.own.write` w manifeście → błąd kompilacji `KCS-KRL-0302`; bez przyznania w polityce hosta → odmowa w czasie wykonania.
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 — wprowadzenie
KretS — wprowadzenie
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.Czym jest
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.
Dla początkujących
KretS to „mózg” pluginu: funkcje, zmienne, warunki, pętle, listy i mapy. Program to zbiór modułów (jeden plik = jeden moduł). Host wywołuje funkcje wskazane w manifeście (np. Main.Start). Kompilator pilnuje typów — nie dodasz liczby do tekstu bez jawnej konwersji.
Dla zaawansowanych programistów
Typowanie statyczne z wnioskowaniem, nullable T?, generyki z ograniczeniami, klasy z pojedynczym dziedziczeniem i interfejsami, wirtualne wywołania, zdarzenia i komendy (on), zadania async/await (współbieżne, jeden wątek, wykrywanie zakleszczeń), strumienie z kontrolą przepływu. Drzewo związane (Bound) jest IR i modelem semantycznym LSP. Kompilacja deterministyczna, mapa źródeł o ścieżkach względnych. Błędy wykonania KCS-VM-* z śladem wywołań; limity zasobów i anulowanie przez hosta nie są przechwytywalne.
Jakie problemy rozwiązuje
Bezpieczna, przewidywalna logika pluginów: weryfikowany bytecode, brak konwersji niejawnych, jawne uprawnienia do każdej operacji hosta, limity instrukcji/pamięci/czasu.
Kiedy używać
- logika pluginu i obsługa komend/zdarzeń hosta
- przetwarzanie danych (rekordy, listy, mapy)
- automatyzacja krokowa (także jako cel KretFlow)
- narzędzia agentów KretAI
- testy
kret test(EXPERIMENTAL)
Kiedy nie używać
- 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
Współpraca z innymi technologiami
KretL (handlery, uprawnienia), KretDB (use Kret.DB as db), KretConfig (use Kret.Config as config), KretAI (use Kret.Ai as ai, narzędzia), KretUI (komendy on …), KretFlow (cel obniżania), KretM (reguły zależności modułów), KretLib (moduły bibliotek), KretBridge (use Kret.Bridge.<usługa>), Kret.Hardware (moduł hosta PROVISIONAL, G-06).
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
KretS — referencja składni
KretS — referencja składni
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.Opisane są wyłącznie konstrukcje potwierdzone implementacją SDK (i, gdzie zaznaczono, testami tej rundy).
module / fn
Moduł i funkcja; funkcje bez parametrów mogą być handlerami cyklu życia.
module Main
fn Start() -> String {
return "Witaj"
}
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.return "Witaj"Zwrócenie wartości z funkcji; nie jest zapisem do dziennika.}Zamknięcie struktury otwartej we wcześniejszych liniach.
| Cecha | Wartość |
|---|---|
| Parametry / typy | nazwa: Typ … |
| Wynik | -> Typ (domyślnie Unit) |
| Wymagania | nazwa modułu = nazwa pliku |
| Ograniczenia | 4096 funkcji; brak przeciążania |
| Możliwe błędy | KCS-KRS-01xx…03xx |
| Wprowadzono | 1.0 (KretScript) |
let / var / const
Stała modułu, stała lokalna, zmienna.
const LIMIT: Int = 100
let name = "Kret"
var total = 0
Czytanie kodu linia po linii
Objaśnienia struktury nie są walidacją semantyczną. Szczegółowy kontrakt opisują referencje i README przykładu.
const LIMIT: Int = 100Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.let name = "Kret"Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.var total = 0Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
| Cecha | Wartość |
|---|---|
| Parametry / typy | wartość początkowa; const tylko literał |
| Wynik | — |
| Wymagania | null, [], list(), map() wymagają znanego typu |
| Ograniczenia | nazwa w funkcji raz |
| Możliwe błędy | KCS-KRS-0307, KCS-KRS-1029 |
| Wprowadzono | const: 2.0 |
record
Typ rekordowy; == porównuje pola; wspólny dla całego pluginu.
record Order {
customer: String
amount: Int
}
let o = Order(customer = "ala", amount = 30)
Czytanie kodu linia po linii
Objaśnienia struktury nie są walidacją semantyczną. Szczegółowy kontrakt opisują referencje i README przykładu.
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.let o = Order(customer = "ala", amount = 30)Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
| Cecha | Wartość |
|---|---|
| Parametry / typy | pola nazwane |
| Wynik | instancja rekordu |
| Wymagania | — |
| Ograniczenia | 1024 rekordy |
| Możliwe błędy | KCS-KRS-03xx |
| Wprowadzono | 1.0 |
if / else / while / for / break / continue
Sterowanie przepływem. for po liście, mapie (klucze rosnąco) i range(a, b).
for v in [1, 2, 3] {
if v == 2 {
continue
}
}
while n < 10 {
n = n + 1
}
Czytanie kodu linia po linii
Objaśnienia struktury nie są walidacją semantyczną. Szczegółowy kontrakt opisują referencje i README przykładu.
for v in [1, 2, 3] {Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.if v == 2 {Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.continueOdczytaj 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.while n < 10 {Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.n = n + 1Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.}Zamknięcie struktury otwartej we wcześniejszych liniach.
| Cecha | Wartość |
|---|---|
| Parametry / typy | warunek Bool |
| Wynik | — |
| Wymagania | — |
| Ograniczenia | limit instrukcji profilu |
| Możliwe błędy | KCS-VM-* |
| Wprowadzono | while/break/continue: 2.0 |
try / catch / throw
Obsługa błędów; catch dostaje String.
try {
db.set("t", 1, "x")
} catch problem {
log.warn(problem)
}
Czytanie kodu linia po linii
Objaśnienia struktury nie są walidacją semantyczną. Szczegółowy kontrakt opisują referencje i README przykładu.
try {Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.db.set("t", 1, "x")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.log.warn(problem)Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.}Zamknięcie struktury otwartej we wcześniejszych liniach.
| Cecha | Wartość |
|---|---|
| Parametry / typy | dowolne wyrażenie w throw |
| Wynik | — |
| Wymagania | — |
| Ograniczenia | limity zasobów i anulowanie przez hosta nieprzechwytywalne |
| Możliwe błędy | KCS-VM-*, KCS-PERM-* |
| Wprowadzono | 2.0 |
nullable T? / orElse / unwrap
Wartość opcjonalna. parseInt zwraca Int64?, Map.get zwraca V? (sprawdzone w tej rundzie).
let n = orElse(parseInt("42"), 0)
let m: Map<String, Int> = map()
let v = orElse(m.get("x"), 0)
Czytanie kodu linia po linii
Objaśnienia struktury nie są walidacją semantyczną. Szczegółowy kontrakt opisują referencje i README przykładu.
let n = orElse(parseInt("42"), 0)Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.let m: Map<String, Int> = map()Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.let v = orElse(m.get("x"), 0)Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
| Cecha | Wartość |
|---|---|
| Parametry / typy | — |
| Wynik | T |
| Wymagania | odczyt/arytmetyka na T? wymaga orElse/unwrap |
| Ograniczenia | unwrap(null) → błąd wykonania |
| Możliwe błędy | KCS-KRS-0322, KCS-KRS-0320 |
| Wprowadzono | 1.0 |
class / interface / override / init / super
Klasy z pojedynczym dziedziczeniem, dowolna liczba interfejsów, wywołania wirtualne.
interface Shape {
fn area() -> Int
}
class Rect : Shape {
w: Int
init(w: Int) {
this.w = w
}
fn area() -> Int {
return this.w
}
}
Czytanie kodu linia po linii
Objaśnienia struktury nie są walidacją semantyczną. Szczegółowy kontrakt opisują referencje i README przykładu.
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.}Zamknięcie struktury otwartej we wcześniejszych liniach.class Rect : Shape {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.w: IntOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.init(w: Int) {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.this.w = wOdczytaj 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.wZwró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.
| Cecha | Wartość |
|---|---|
| Parametry / typy | pola let/var, jeden init |
| Wynik | obiekt: Rect(2) |
| Wymagania | nadpisanie wymaga override |
| Ograniczenia | brak wielokrotnego dziedziczenia klas, metod async, wielu konstruktorów, struct |
| Możliwe błędy | KCS-KRS-1xxx |
| Wprowadzono | 2.0 |
generics
Generyki klas, interfejsów i funkcji z ograniczeniem T: Typ; argumenty typów wnioskowane.
class Pair<A, B> { … }
fn largest<T: Shape>(items: List<T>) -> T { … }
Czytanie kodu linia po linii
Objaśnienia struktury nie są walidacją semantyczną. Szczegółowy kontrakt opisują referencje i README przykładu.
class Pair<A, B> { … }Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.fn largest<T: Shape>(items: List<T>) -> T { … }Sygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.
| Cecha | Wartość |
|---|---|
| Parametry / typy | parametry typu |
| Wynik | — |
| Wymagania | — |
| Ograniczenia | — |
| Możliwe błędy | KCS-KRS-1xxx |
| Wprowadzono | 2.0 |
event / on / emit / subscribe
Zdarzenia pluginu i handlery; on nazwa(...) -> T z wynikiem = komenda hosta/KretUI.
event order.placed(amount: Int)
on order.placed(amount: Int) {
log.info(toString(amount))
}
emit order.placed(5)
subscribe order.placed with extra
Czytanie kodu linia po linii
Objaśnienia struktury nie są walidacją semantyczną. Szczegółowy kontrakt opisują referencje i README przykładu.
event order.placed(amount: Int)Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.on order.placed(amount: Int) {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.log.info(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.emit order.placed(5)Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.subscribe order.placed with extraOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
| Cecha | Wartość |
|---|---|
| Parametry / typy | typowane argumenty |
| Wynik | komenda: -> T |
| Wymagania | host dostarcza tylko nazwy z handlers manifestu |
| Ograniczenia | emit nieznanego zdarzenia = błąd |
| Możliwe błędy | KCS-KRS-1028 |
| Wprowadzono | 2.0 |
async / await / Task / Stream
Zadania współbieżne i strumienie z buforem.
async fn slow(ms: Int) -> Int {
await delay(milliseconds(ms))
return ms
}
let s: Stream<Int> = stream(2)
for await v in s { … }
Czytanie kodu linia po linii
Objaśnienia struktury nie są walidacją semantyczną. Szczegółowy kontrakt opisują referencje i README przykładu.
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.let s: Stream<Int> = stream(2)Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.for await v in s { … }Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.
| Cecha | Wartość |
|---|---|
| Parametry / typy | — |
| Wynik | Task<T> |
| Wymagania | — |
| Ograniczenia | 1024 zadania/liczniki; jeden wątek; zakleszczenie = błąd |
| Możliwe błędy | KCS-VM-* |
| Wprowadzono | 2.0 |
is / as / Any
Sprawdzenie i rzutowanie typu w czasie wykonania (także obiektów klas).
if shape is Square { … }
let n = value as Int
Czytanie kodu linia po linii
Objaśnienia struktury nie są walidacją semantyczną. Szczegółowy kontrakt opisują referencje i README przykładu.
if shape is Square { … }Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.let n = value as IntWiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
| Cecha | Wartość |
|---|---|
| Parametry / typy | — |
| Wynik | Bool / typ docelowy |
| Wymagania | — |
| Ograniczenia | złe rzutowanie → KCS-VM-0006 |
| Możliwe błędy | KCS-VM-0006 |
| Wprowadzono | 2.0 |
log.*
Dziennik pluginu: info warn error debug.
log.info("tekst")
Czytanie kodu linia po linii
Objaśnienia struktury nie są walidacją semantyczną. Szczegółowy kontrakt opisują referencje i README przykładu.
log.info("tekst")Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
| Cecha | Wartość |
|---|---|
| Parametry / typy | String |
| Wynik | Unit |
| Wymagania | logs.own.write (w Core zablokowane przez D-KCS-01) |
| Ograniczenia | — |
| Możliwe błędy | KCS-KRL-0302, KCS-PERM-* |
| Wprowadzono | 1.0 |
Kret.Hardware (moduł hosta, PROVISIONAL)
Odczyty sensorów przez KCS i dostawcę hosta (Core). Używany przez KretSystemDashboard/KretSensorsViewer. Nieopisany w LANGUAGE_FREEZE_1_0 — G-06 (proponowany status PROVISIONAL).
use Kret.Hardware as hardware
let text = hardware.text("cpu.usage")
let sample = hardware.sample("memory.usage")
Czytanie kodu linia po linii
Objaśnienia struktury nie są walidacją semantyczną. Szczegółowy kontrakt opisują referencje i README przykładu.
use Kret.Hardware as hardwareOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.let text = hardware.text("cpu.usage")Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.let sample = hardware.sample("memory.usage")Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
| Cecha | Wartość |
|---|---|
| Parametry / typy | nazwa odczytu (np. memory.usage, cpu.usage) |
| Wynik | text → String, sample → List<String> |
| Wymagania | uprawnienia sensorów (system.ram.read, …) — Production BLOCKED_BY_KCS |
| Ograniczenia | w samym SDK brak dostawcy — odmowa/UNAVAILABLE; starsze SDK → KCS-KRS-1010 |
| Możliwe błędy | KCS-KRS-1010, KCS-PERM-* |
| Wprowadzono | rc.3+kc-base (Core 6.10) |
KretS — samouczek BASIC
KretS — samouczek BASIC
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: 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. Najczęstsze błędy typów (KRETS-B02-CommonTypeErrors)
Projekt: ../../Examples/BASIC_CommonTypeErrors/ · klasyfikacja VALIDATION_ONLY · Playground LOCAL_VALIDATE
Kroki (katalog roboczy: katalog przykładu):
kret check mixed-numbers --json— oczekiwany błąd — w wyniku:KCS-KRS-0320kret check untyped-null --json— oczekiwany błąd — w wyniku:KCS-KRS-0307kret run fixed --policy fixed/host-policy.json --data {DATA}— w wyniku:brak
Wynik tej rundy: PASS — zob. EXPECTED_OUTPUT.txt.
2. Pierwszy program KretS (KRETS-B01-HelloWorld)
Projekt: ../../Examples/BASIC_HelloWorld/ · 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:Witaj, Kret!
Wynik tej rundy: PASS — zob. EXPECTED_OUTPUT.txt.
Ćwiczenie i sprawdzenie wiedzy
W HelloWorld znajdź moduł, sygnaturę i return. W CommonTypeErrors wskaż niezgodność typu bez zmieniania oczekiwanego wyniku testu.
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. Plik Main.krs deklaruje module Main. fn Start() -> String zwraca tekst; return przekazuje wartość do wywołującego, nie jest zapisem do dziennika. let wiąże wartość lokalną, var pozwala ją zmieniać, const wymaga literału. Przy null i pustej kolekcji potrzebny jest znany typ.
Podsumowanie i następny krok
Plik Main.krs deklaruje module Main. fn Start() -> String zwraca tekst; return przekazuje wartość do wywołującego, nie jest zapisem do dziennika. let wiąże wartość lokalną, var pozwala ją zmieniać, const wymaga literału. Przy null i pustej kolekcji potrzebny jest znany typ.
Zaloguj się na konto użytkownika, aby zapisywać postęp i zakładki. Konta obsługi mogą czytać bez zapisu postępu. Logowanie →