نحو پایه

    این مقاله مقدمه‌ای بر زبان برنامه‌نویسی کوروش است. فرض بر این است که شما از پیش با مفاهیم برنامه‌نویسی مانند متغیرها، عبارات و انواع آشنا هستید. در اینجا خواهید دید که چگونه ایده‌های آشنا در کوروش بیان می‌شوند، همچنین با مفاهیم جدیدی که این زبان را منحصربه‌فرد می‌سازند نیز آشنا خواهید شد.

    اگر هنوز کوروش را نصب نکرده‌اید، پیش از ادامه از راهنمای شروع به کار شروع کنید.

    توضیحات (Comments)

    توضیحات بخش‌هایی از متن هستند که توسط کامپایلر نادیده گرفته می‌شوند. آنها برای توضیح کد، گذاشتن یادداشت یا غیرفعال کردن موقت بخش‌هایی از برنامه مفید هستند. کوروش از توضیحات تک‌خطی و چندخطی پشتیبانی می‌کند.

    • توضیحات تک‌خطی
    // This is a single-line comment
    var msg: char* = "Hello, Cyrus!"; // You can also place it after code
    
    • توضیحات چندخطی
    /*
      Outer comment start
      /* Nested comment inside */
      Outer comment end
    
      Multi-line comments can also be nested!
    */
    

    ثابت‌های رشته‌ای و نویسه‌ای

    لیترال‌های رشته‌ای در کوروش درون علامت نقل‌قول دوتایی "xxx" محصور می‌شوند، در حالی که لیترال‌های نویسه‌ای درون علامت نقل‌قول تکی 'x' قرار می‌گیرند. هر دو شکل دنباله‌هایی از نویسه‌های یونیکد را نمایش می‌دهند، اما از نظر کاربرد و هدف متفاوت هستند:

    • لیترال‌های رشته‌ای مقادیری از نوع char* تولید می‌کنند که می‌توانند تعداد دلخواهی نویسه را در خود نگه دارند.
    • لیترال‌های نویسه‌ای مقادیری از نوع char تولید می‌کنند که همواره دقیقاً یک مقدار اسکالر یونیکد را نشان می‌دهند.
    var greeting: char* = "Hello, Cyrus!";
    var letter: char = 'A';
    

    دنباله‌های گریز (Escapes)

    نویسه‌های خاصی که تایپ مستقیم آنها دشوار است یا در غیر این صورت ساختار نحو را می‌شکنند، می‌توانند با استفاده از دنباله‌های گریز نوشته شوند. همه دنباله‌های گریز با یک بک‌اسلش () شروع می‌شوند.

    گریزهای رایج عبارتند از:

    • \n - خط جدید (line feed, U+000A)
    • \t - تب افقی (horizontal tab, U+0009)
    • \r - بازگشت به ابتدای خط (carriage return, U+000D)
    • \b - بک‌اسپیس (backspace, U+0008)
    • \a - زنگ/هشدار (bell/alert, U+0007)
    • \v - تب عمودی (vertical tab, U+000B)
    • \f - تغذیه صفحه (form feed, U+000C)
    • \ - بک‌اسلش لفظی
    • " - نقل‌قول دوتایی (داخل رشته‌ها)
    • ' - نقل‌قول تکی (داخل نویسه‌ها یا رشته‌ها)

    مثال:

    var poem: char* = "Line one\nLine two\nLine three";
    var quote: char* = "She said: \"Cyrus is great!\"";
    var backslash: char = '\\';
    
    var paragraph: char* = "Lorem Ipsum is simply dummy text of the printing and typesetting industry.
    Lorem Ipsum has been the industry's standard dummy text ever since the 1500s,
    when an unknown printer took a galley of type and scrambled it to make a type specimen book.";
    

    یونیکد و ایموجی‌ها

    کوروش مستقیماً از نویسه‌های یونیکد در لیترال‌های رشته‌ای و نویسه‌ای پشتیبانی می‌کند. می‌توانید ایموجی‌ها، حروف همراه با اعراب یا هر نویسه یونیکد دیگری را داخل علامت نقل‌قول تایپ کنید:

    var letter: char = 'A';                     // valid
    var smile: char* = "😇";                    // valid
    var rocket: string = "Let's go! \u{1F680}"; // valid "Let's go! 🚀"
    var greek_alpha: char* = "\u03B1";          // valid "α"
    var emoji_char: char = '😇';                // NOT VALID
    var multibyte_char: char = '\u263A';        // NOT VALID
    

    ثابت‌های اعداد صحیح

    ثابت‌های عددی در کوروش می‌توانند در قالب‌های دهدهی، هگزادسیمال، اکتال یا دودویی نوشته شوند:

    • دهدهی (مبنای ۱۰):
    var a = 1234;
    
    • هگزادسیمال (مبنای ۱۶، پیشوند 0x یا 0X):
    var b = 0x42EDAA02;
    
    • دودویی (مبنای ۲، پیشوند 0b یا 0B):
    var c = 0b101010;
    

    لیترال‌های عددی ممکن است برای خوانایی بیشتر شامل زیرخط _ بین ارقام باشند؛ این زیرخط‌ها توسط کامپایلر نادیده گرفته می‌شوند:

    var million = 1_000_000;
    var hex_val = 0xDE_AD_BE_EF;
    

    پسوندهای لیترال

    کوروش امکان استفاده از پسوندهای نوع صریح بر روی لیترال‌های عددی را برای مشخص کردن نوع آنها فراهم می‌کند. این امر زمانی مفید است که کامپایلر نتواند نوع را استنتاج کند یا زمانی که می‌خواهید نوع خاصی را تضمین کنید.

    پسوندهای اعداد صحیح

    پسوندهای معتبر اعداد صحیح عبارتند از:

    • uintptr
    • intptr
    • usize
    • isize
    • int
    • int8
    • int16
    • int32
    • int64
    • int128
    • uint
    • uint8
    • uint16
    • uint32
    • uint64
    • uint128

    پسوندهای معتبر اعداد اعشاری عبارتند از:

    • float16
    • float32
    • float64
    • float128

    مثال:

    var a = 1234int64;
    var b = 3.14float64;
    

    نوع پیش‌فرض لیترال‌ها

    اگر پسوند نوع را مشخص نکنید، کوروش int را به عنوان نوع پیش‌فرض برای لیترال‌های اعداد صحیح و float64 را به عنوان نوع پیش‌فرض برای لیترال‌های اعداد اعشاری در نظر می‌گیرد.

    می‌توان از پسوندهای نوع برای کنترل صریح اندازه و علامت‌دار بودن یک لیترال عدد صحیح، یا برای انتخاب دقت ممیز شناور متفاوت استفاده کرد.

    آرایه‌ها

    آرایه‌ها دنباله‌هایی با اندازه ثابت و تخصیص‌یافته در پشته هستند. اندازه باید در زمان کامپایل مشخص باشد.

    انواع صریح و استنتاج‌شده

    می‌توانید انواع را به صورت صریح تعریف کنید یا اجازه دهید کامپایلر آنها را استنتاج کند:

    // Explicit
    var a = int[3]{1, 2, 3};
    
    // Inferred
    const untyped = {1, 2, 3};
    

    آرایه‌های چندبعدی

    const matrix = int[2][3] {
        int[3] {1, 2, 3},
        int[3] {1, 2, 3},
    };
    

    اشاره‌گرها

    اشاره‌گرها در کوروش مشابه C عمل می‌کنند.

    var a: int = 10;
    var b: int* = &a;
    

    GEP و زوال (Decay)

    کوروش دسترسی به اشاره‌گرها را ساده می‌کند:

    1. GEP: می‌توانید مستقیماً روی اشاره‌گرها ایندکس‌گذاری کنید (معنای GetElementPtr).

      var ptr: int* = malloc(8);
      ptr[0] = 10;
      ptr[1] = 20;
      
    2. زوال (Decay): آرایه‌ها هنگامی که به یک نوع اشاره‌گر تخصیص داده می‌شوند، به طور خودکار به اشاره‌گر تبدیل (زوال) می‌یابند.

      const nums = int[3]{1, 2, 3};
      const ptr: int* = nums; // Equivalent to &nums[0]
      
    3. اشاره‌گر به آرایه:

      const nums = int[3]{1, 2, 3};
      var ptr: int[3]* = &nums;
      
      (*ptr)[0] = 10;
      

    ثابت‌بودن و تغییرپذیری اشاره‌گر

    کوروش بین تغییرپذیری خود اشاره‌گر و تغییرپذیری داده‌ای که به آن اشاره می‌کند تمایز قائل می‌شود. اگر از یک مقدار const reference بگیرید، اشاره‌گر حاصل به طور خودکار یک اشاره‌گر به یک ثابت است (مانند const int*) که از تغییر مقدار زیربنایی از طریق آن اشاره‌گر جلوگیری می‌کند.

    pub fn main() {
       const x = 10;
    
       // immut_ref is a mutable pointer to a constant integer (const int*)
       var immut_ref = &x;
    
       // ERROR: cannot modify a value through a 'const int*'
       *immut_ref = 20;
    
       printf("%d\n", *immut_ref);
    
       // However, the pointer itself can be reassigned:
       const y = 30;
       immut_ref = &y;
    }