رفتن به محتوا
فارسی

راهنمای زبان

تصویر مستندات 0.0.18پشتیبانی و محدودیت‌ها ↗

این مستندات محدودهٔ نهایی پیش‌انتشار آزمایشی v0.0.18 را شرح می‌دهند. وضعیت انتشار واقعی و فایل‌های دانلود در GitHub Releases ثبت می‌شوند. این راهنما نحو اصلی را معرفی می‌کند. قرارداد نحو و قرارداد معناشناسی مخزن مرجع معتبرند. این‌ها قطعه‌کدهای آموزشی‌اند؛ تفاوت‌ها را در پشتیبانی از مسیرهای اجرا ببینید.

name = "Ku"
count:int = 3
ready:bool = true
values:[int] = [1, 2, 3]
count += 1

اولین انتساب، متغیر را تعریف می‌کند. انواع اولیه int، ‏float، ‏bool، ‏str و null هستند. اعداد صحیح ۶۴ بیتی علامت‌دارند؛ ممیز شناور از binary64 استفاده می‌کند. اعداد صحیح با تبدیل ضمنی به مقدار درست، شرط نمی‌شوند.

این نمونهٔ کامل پایه از examples/function.ku گرفته شده است:

fn add(a: int, b: int): int {
return a + b
}
fn main() {
println(add(10, 20))
}

خروجی مورد انتظار 30 است. این قطعهٔ جریان کنترل را می‌توان داخل main قرار داد:

total = 0
for 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 هستند. رشته‌ها، آرایه‌ها، اشیا، ساختارها، enumها، 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 استفاده می‌کند. API برنامه‌ای با نام task.spawn، ‏Task.new یا thread.spawn وجود ندارد. پوشش مفسر و زیرمجموعهٔ بومی Task متفاوت است. کارکرد یک نمونه در یک مسیر اجرا، پشتیبانی کامل مسیر دیگر را اثبات نمی‌کند. پشتیبانی از پلتفرم‌ها و مسیرهای اجرا را ببینید.