Przejdź do treści

KRET LANGUAGE ACADEMY · DOKUMENTACJA ZE ŹRÓDEŁ

Moduł, funkcja i typ wyniku

BASIC20 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.
  • 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.

  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 sum = toFloat(1) + 2.0Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
  5. let nothing: String? = nullWiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
  6. return toString(sum) + " / " + orElse(nothing, "brak")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: 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.

  1. module MainDeklaracja modułu KretS; porównaj nazwę z nazwą pliku.
  2. Pusta linia oddziela fragmenty źródła.
  3. // Pierwszy program: zmienna, tekst, dziennik.Komentarz autora; nie jest wykonywany.
  4. fn Start() -> String {Sygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.
  5. let name = "Kret"Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
  6. log.info("Witaj, " + name + "!")Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  7. return "Witaj, " + name + "!"Zwrócenie wartości z funkcji; nie jest zapisem do dziennika.
  8. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  9. Pusta linia oddziela fragmenty źródła.
  10. fn Shutdown() {Sygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.
  11. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  12. 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

Otwórz cały rozdział ze źródłem →
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.

  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. return "Witaj"Zwrócenie wartości z funkcji; nie jest zapisem do dziennika.
  5. }Zamknięcie struktury otwartej we wcześniejszych liniach.
CechaWartość
Parametry / typynazwa: Typ …
Wynik-> Typ (domyślnie Unit)
Wymaganianazwa modułu = nazwa pliku
Ograniczenia4096 funkcji; brak przeciążania
Możliwe błędyKCS-KRS-01xx…03xx
Wprowadzono1.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.

  1. const LIMIT: Int = 100Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
  2. let name = "Kret"Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
  3. var total = 0Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
CechaWartość
Parametry / typywartość początkowa; const tylko literał
Wynik—
Wymaganianull, [], list(), map() wymagają znanego typu
Ograniczenianazwa w funkcji raz
Możliwe błędyKCS-KRS-0307, KCS-KRS-1029
Wprowadzonoconst: 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.

  1. record Order {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  2. customer: StringOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  3. amount: IntOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  4. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  5. let o = Order(customer = "ala", amount = 30)Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
CechaWartość
Parametry / typypola nazwane
Wynikinstancja rekordu
Wymagania—
Ograniczenia1024 rekordy
Możliwe błędyKCS-KRS-03xx
Wprowadzono1.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.

  1. for v in [1, 2, 3] {Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.
  2. if v == 2 {Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.
  3. continueOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  4. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  5. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  6. while n < 10 {Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.
  7. n = n + 1Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  8. }Zamknięcie struktury otwartej we wcześniejszych liniach.
CechaWartość
Parametry / typywarunek Bool
Wynik—
Wymagania—
Ograniczenialimit instrukcji profilu
Możliwe błędyKCS-VM-*
Wprowadzonowhile/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.

  1. try {Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.
  2. db.set("t", 1, "x")Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  3. } catch problem {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  4. log.warn(problem)Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  5. }Zamknięcie struktury otwartej we wcześniejszych liniach.
CechaWartość
Parametry / typydowolne wyrażenie w throw
Wynik—
Wymagania—
Ograniczenialimity zasobów i anulowanie przez hosta nieprzechwytywalne
Możliwe błędyKCS-VM-*, KCS-PERM-*
Wprowadzono2.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.

  1. let n = orElse(parseInt("42"), 0)Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
  2. let m: Map<String, Int> = map()Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
  3. let v = orElse(m.get("x"), 0)Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
CechaWartość
Parametry / typy—
WynikT
Wymaganiaodczyt/arytmetyka na T? wymaga orElse/unwrap
Ograniczeniaunwrap(null) → błąd wykonania
Możliwe błędyKCS-KRS-0322, KCS-KRS-0320
Wprowadzono1.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.

  1. interface Shape {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  2. fn area() -> IntSygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.
  3. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  4. class Rect : Shape {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  5. w: IntOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  6. init(w: Int) {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  7. this.w = wOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  8. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  9. fn area() -> Int {Sygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.
  10. return this.wZwrócenie wartości z funkcji; nie jest zapisem do dziennika.
  11. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  12. }Zamknięcie struktury otwartej we wcześniejszych liniach.
CechaWartość
Parametry / typypola let/var, jeden init
Wynikobiekt: Rect(2)
Wymaganianadpisanie wymaga override
Ograniczeniabrak wielokrotnego dziedziczenia klas, metod async, wielu konstruktorów, struct
Możliwe błędyKCS-KRS-1xxx
Wprowadzono2.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.

  1. class Pair<A, B> { … }Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  2. fn largest<T: Shape>(items: List<T>) -> T { … }Sygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.
CechaWartość
Parametry / typyparametry typu
Wynik—
Wymagania—
Ograniczenia—
Możliwe błędyKCS-KRS-1xxx
Wprowadzono2.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.

  1. event order.placed(amount: Int)Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  2. on order.placed(amount: Int) {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  3. log.info(toString(amount))Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  4. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  5. emit order.placed(5)Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  6. subscribe order.placed with extraOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
CechaWartość
Parametry / typytypowane argumenty
Wynikkomenda: -> T
Wymaganiahost dostarcza tylko nazwy z handlers manifestu
Ograniczeniaemit nieznanego zdarzenia = błąd
Możliwe błędyKCS-KRS-1028
Wprowadzono2.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.

  1. async fn slow(ms: Int) -> Int {Sygnatura funkcji: nazwa, argumenty i ewentualny typ wyniku.
  2. await delay(milliseconds(ms))Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  3. return msZwrócenie wartości z funkcji; nie jest zapisem do dziennika.
  4. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  5. let s: Stream<Int> = stream(2)Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
  6. for await v in s { … }Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.
CechaWartość
Parametry / typy—
WynikTask<T>
Wymagania—
Ograniczenia1024 zadania/liczniki; jeden wątek; zakleszczenie = błąd
Możliwe błędyKCS-VM-*
Wprowadzono2.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.

  1. if shape is Square { … }Sterowanie lub obsługa błędu KretS; szczegóły określa referencja tej konstrukcji.
  2. let n = value as IntWiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
CechaWartość
Parametry / typy—
WynikBool / typ docelowy
Wymagania—
Ograniczeniazłe rzutowanie → KCS-VM-0006
Możliwe błędyKCS-VM-0006
Wprowadzono2.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.

  1. log.info("tekst")Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
CechaWartość
Parametry / typyString
WynikUnit
Wymaganialogs.own.write (w Core zablokowane przez D-KCS-01)
Ograniczenia—
Możliwe błędyKCS-KRL-0302, KCS-PERM-*
Wprowadzono1.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.

  1. use Kret.Hardware as hardwareOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  2. let text = hardware.text("cpu.usage")Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
  3. let sample = hardware.sample("memory.usage")Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
CechaWartość
Parametry / typynazwa odczytu (np. memory.usage, cpu.usage)
Wyniktext → String, sample → List<String>
Wymaganiauprawnienia sensorów (system.ram.read, …) — Production BLOCKED_BY_KCS
Ograniczeniaw samym SDK brak dostawcy — odmowa/UNAVAILABLE; starsze SDK → KCS-KRS-1010
Możliwe błędyKCS-KRS-1010, KCS-PERM-*
Wprowadzonorc.3+kc-base (Core 6.10)
Otwórz cały rozdział ze źródłem →
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):

  1. kret check mixed-numbers --json — oczekiwany błąd — w wyniku: KCS-KRS-0320
  2. kret check untyped-null --json — oczekiwany błąd — w wyniku: KCS-KRS-0307
  3. kret 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):

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

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

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

Ć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.

Porównujemy zapis z referencją. To ćwiczenie nie jest walidatorem programu.
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

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 →

Wybierz, co możemy zapamiętać w tej przeglądarce. Możesz zmienić decyzję w każdej chwili.

Polityka prywatności