Cairo programlama dili, statik bir yapıya sahip olup, derleme sürecinde tüm değişkenlerin türlerinin belirlenmesini gerektirir. Cairo'da veri türleri, belirli gruplara ayrılmıştır.


Skaler Türler


Skaler tür, tek bir değeri temsil eder. Cairo'da üç ana skaler tür bulunmaktadır: felt, integer ve boolean. Şimdi bu türlerin işleyişlerine bir göz atalım.


Felt252


Cairo'da, bir değişkenin veya argümanın türü belirtilmediğinde, varsayılan olarak alan elemanı (felt252) türü kullanılır. Alan elemanı, 0 ile P arasında bir tamsayıdır. Toplama, çıkarma veya çarpma işlemlerinde sonuç P'ye göre mod alınır. Bölme işlemi, standart bölme işleminden farklıdır ve (x / y) * y == x denklemi her zaman geçerlidir. Ancak,y'nin x'i tam olarak bölemediği durumlarda beklenmeyen sonuçlar elde edilebilir. Örneğin, 1 / 2 ifadesi (P+1)/2 olarak kabul edilir. Alan elemanları, değerlerin belirlenen aralığın dışına çıktığında modüler aritmetik kullanarak otomatik olarak sarmalanma özelliğine sahiptir.

fn main() {
  // max value of felt252
  let x: felt252 = 3618502788666131213697322783095070105623107215331596699973092056135872020480;
  let y: felt252 = 1;
  assert(x + y == 0, 'P == 0 (mod P)');
}


Felt252 türü, varsayılan veri türü olduğu için, değişkenin türünü belirtmeye gerek yoktur. Tür belirtmeyen değişkenler, otomatik olarak felt252 türü olarak tanımlanır.

fn main() {
  // max value of felt252
  let x = 3618502788666131213697322783095070105623107215331596699973092056135872020480;
  let y = 1;
  assert(x + y == 0, 'P == 0 (mod P)');
}


Integer


Felt252 türü, tüm türlerin temelini oluşturan bir tür olsa da, programcıların mümkün olduğunda integer türlerini kullanmaları önerilir. Çünkü integer türleri, kodun potansiyel güvenlik açıklarına karşı ekstra koruma sağlar.


Integer tür bildirimi, programcının tamsayıyı depolamak için kullanabileceği bit sayısını belirtir. Cairo'da yerleşik tamsayı türleri aşağıdaki tabloda gösterilmiştir. Bir tamsayı değerinin türünü belirtmek için bu türlerden herhangi birini kullanabilirsiniz.


Length  --   Unsigned

8-bit        --    u8
16-bit      --    u16
32-bit      --    u32
64-bit      --    u64
128-bit    --    u128
256-bit    --    u256
32-bit      --    usize


Her bir türün açık bir boyutu vardır. Değişkenler işaretsiz olduğu için negatif bir sayı içeremezler. Bu programın çökmesine neden olur:

fn sayi(x: u8, y: u8) -> u8 {
  x - y
}

fn main() {
  sayi(1, 3);
}


şu şekil bir hata çıktısı alırsınız

Run panicked with [608642109794502019480482122260311927 ('u8_sub Overflow'), ].


Sayısal İşlemler


Cairo, tüm tamsayı türleri için temel matematiksel işlemleri destekler: toplama, çıkarma, çarpma, bölme ve kalan.

fn main() {
  // addition
  let sum = 5_u128 + 10_u128;

  // subtraction
  let difference = 95_u128 - 4_u128;

  // multiplication
  let product = 4_u128 * 30_u128;

  // division
  let quotient = 56_u128 / 32_u128; 
  let quotient = 64_u128 / 32_u128;

  // remainder
  let remainder = 43_u128 % 5_u128;-
}


Cairo'nun desteklediği tüm operatörlerin listesine aşağıdaki linkten ulaşabilirsiniz.

https://book.cairo-lang.org/appendix-02-operators-and-symbols.html#operators


Boolean


Cairo'da, diğer birçok programlama dilinde olduğu gibi, Boolean türü iki olası değere sahiptir: true ve false. Cairo'da Boolean türü bool olarak belirtilir.

fn main() {
  let t = true;

  let f: bool = false; 
}


String


Cairo'da string türü, felt252'de saklanan karakterlerin bir koleksiyonudur. String bir ifade en fazla 31 karakter uzunluğunda olabilir.

use debug::PrintTrait;
fn main() {
  let x = 'Cairo is awesome';
  x.print();
  let c = 'A';
  c.print();
}


bu kodu çalıştırmak için terminalinize scarb cairo-run komutunu girebilirisiniz.


Tür Dönüşümleri


Cairo'da, bir türü başka bir türe dönüştürmek için TryInto ve Into özellikleri tarafından sağlanan try_into ve into yöntemlerini kullanabilirsiniz. try_into yöntemi, hedef türün kaynak değere uygun olmayabileceği durumlarda güvenli tür dönüşümüne izin verir. try_into, yeni değere erişmek için Option türünü döndürür ve bu değeri açmak için unwrap() yöntemi kullanılır.

use traits::TryInto;
use traits::Into;
use option::OptionTrait;

fn main() {
  let my_felt252 = 10;
  // felt252 bir u8'e sığmayabileceğinden, Option<T> türünü açmanız gerekir
  let my_u8: u8 = my_felt252.try_into().unwrap();
  let my_u16: u16 = my_u8.into();
  let my_u32: u32 = my_u16.into();
  let my_u64: u64 = my_u32.into();
  let my_u128: u128 = my_u64.into();
  // felt252, bir u256'dan daha küçük olduğu için into() yöntemini kullanabiliriz
  let my_u256: u256 = my_felt252.into();
  let my_usize: usize = my_felt252.try_into().unwrap();
  let my_other_felt252: felt252 = my_u8.into();
  let my_third_felt252: felt252 = my_u16.into();
}



Tuple Türü


Bir tuple, çeşitli türlere sahip bir dizi değeri tek bir bileşik tipte gruplandırmanın genel bir yoludur. Tuples sabit bir uzunluğa sahiptir: bir kez ilan edildikten sonra, boyut olarak büyüyemez veya küçülemezler.


Parantez içine virgülle ayrılmış bir değer listesi yazarak bir tuple oluşturabiliriz. Demetteki farklı değerlerin türlerini farklı olabilir.

fn main() {
  // Tuple'daki her konumu ve türünü açıkça bildirebilirsiniz.
  let tup: (u32, u64, bool) = (8, 65, false);
  // Veya türleri belirtmeden de bildirilebilir.
  let tup = (false, 2, 70);

  // Bir tuple tek bir öğe olarak kabul edildiğinden, 
  // tek tek öğeleri almak için kalıp eşleştirmeyi kullanabilirsiniz
  let (x, y, z) = tup; 
  // Tuple'ı bildirirken bunu da yapabilirsiniz.
  let (x, y): (felt252, felt252) = (2, 3);
}


İşte kenar uzunluklarını tuple olarak tanımladığımız bir dikdörtgen prizmasının hacmini hesaplayan bir örnek:

use debug::PrintTrait;

fn volume(sides: (u64, u64, u64)) -> u64 {
  let (x, y, z) = sides;
  x * y * z
}

fn main() {
  let dikdortgen_prizma = (20, 30, 40); // En x Boy x Derinlik
  let v = volume(dikdortgen_prizma);
  v.print(); 
}


Kodu çalıştırmak için terminalde scarb cairo-run komutunu kullanabilirsiniz.