言語ガイド
本書は実験的プレリリース v0.0.18 の確定した範囲を説明します。実際の公開状況とダウンロードは GitHub Releases を確認してください。このガイドでは中心となる構文を紹介します。リポジトリの構文仕様と意味仕様が正式な定義です。以下は学習用の断片です。差異についてはバックエンドの対応範囲を参照してください。
name = "Ku"count:int = 3ready:bool = truevalues:[int] = [1, 2, 3]count += 1最初の代入で変数を宣言します。プリミティブ型は int、float、bool、str、null です。整数は符号付き 64 ビット、浮動小数点数は binary64 です。整数を真偽値に暗黙変換して条件にすることはできません。
関数と制御フロー
「関数と制御フロー」という見出しのセクション次の完全な基本例は examples/function.ku にあります:
fn add(a: int, b: int): int { return a + b}
fn main() { println(add(10, 20))}期待される出力は 30 です。次の制御フローの断片は main 内に記述できます:
total = 0for i in 5 { total += i}if (total == 10) { println("sum ok")}for i in 5 は 0 から 4 まで反復します。if と while の条件には bool が必要です。複数の文には波括弧を使います。分岐式は match を使用し、switch はありません。
所有権と読み取り専用の借用
「所有権と読み取り専用の借用」という見出しのセクションint、float、bool、null は Copy 値です。文字列、配列、オブジェクト、構造体、列挙型、Result、関数値は Owned です。代入と通常の引数は、既定で所有値をムーブします。独立した値が必要な場合は .clone() を使用してください。Task はクローンできません。
original = "Ku"copy = original.clone()println(original)println(copy)同期関数では、読み取り専用の借用パラメーターを宣言できます:
fn length(&text: str): int { return text.len()}引数に & を付けず、length(value) として呼び出します。借用データの変更、ムーブによる取り出し、呼び出し外への持ち出しはできません。非同期パラメーターの借用などの組み合わせには、まだ対応していません。読み取り専用の借用は、任意の関数の純粋性を保証するものではありません。
構造体、オブジェクト、モジュール
「構造体、オブジェクト、モジュール」という見出しのセクションstruct User { name: str age: int}
user = User { name: "Ku", age: 1 }println(user.name)動的オブジェクトは { name: "Ku" } で表します。通常のオブジェクト添字でキーが存在しない場合は失敗します。value["name"]? は Result を通して参照を処理し、成功時に KuValue を返します。具体的な型を得るには .as_str()? や .as_int()? を使用してください。存在しないキーが暗黙に null になることはありません。
標準ライブラリのインポートには import json from "std.json" のようなドット区切りのパスを使います。ローカルモジュールでは import math from "./math" が使えます。ユーザー定義のトップレベルエクスポートは ASCII 大文字で始めます。小文字の名前はファイル内に限定されます。
回復可能なエラー
「回復可能なエラー」という見出しのセクション戻り値の型 T! は、T または Error を返します。? は回復可能なエラーを伝播し、fail はエラーを作成します:
fn read_name(): str! { fail "name missing"}
fn main() { try { println(read_name()?) } catch (error) { println(error.message) }}Error には domain、code、message フィールドがあります。通常の catch は panic、Task のキャンセル、タイムアウトを捕捉しません。finally 内のキャンセル時クリーンアップも、共通の絶対期限の予算を使用します。任意のユーザークリーンアップの完了は保証されません。
並行処理の境界
「並行処理の境界」という見出しのセクションアプリケーションコードは async fn を呼び出して一度だけ使用できる Task ハンドルを取得し、await を使用します。task.spawn、Task.new、thread.spawn というアプリケーション API はありません。インタープリターとネイティブ Task サブセットの対応範囲は異なります。あるバックエンドで動作する例は、別のバックエンドでの完全な対応を証明しません。プラットフォームとバックエンドの対応範囲を参照してください。