Claridad C-Style
Un modelo mental cercano a C, con locales explicitos, loops explicitos y control directo sobre valores y ramas.
fn sumRange(limit: s32) s32 {
var i: s32 = 0;
var total: s32 = 0;
while i < limit {
total += i;
i++;
}
return total;
}
fn main() s32 @public {
var total: s32 = sumRange(5);
if total != 10 {
return 1;
}
return 0;
}
struct Buffer @public {
data: ptr[u8],
length: usize,
capacity: usize
}
fn main() s32 @public {
var buffer: Buffer = new Buffer {
data: nullptr,
length: 8,
capacity: 64
};
buffer->length = buffer->length + 4;
return buffer->capacity as s32;
}
Generics en Compile-Time
Funciones y estructuras genericas con instanciacion explicita, sin costo dinamico extra.
fn add[T](a: T, b: T) T @public {
return a + b;
}
struct Pair[T] @public {
left: T,
right: T
}
fn main() s32 @public {
var nums := new Pair[s32] {
left: 2,
right: 4
};
return nums->left + nums->right;
}
struct Buffer[T] @public {
data: ptr[T],
length: usize,
capacity: usize
}
fn main() s32 @public {
var buf := new Buffer[u8] {
data: nullptr,
length: 0,
capacity: 64
};
return buf->capacity as s32;
}
Interoperabilidad con C
Integracion directa con C mediante @extern y @convention("C").
fn printf(fmt: const array[char]) s32
@public @arbitraryArgs
@extern("printf") @convention("C");
fn atoi(text: const array[char]) s32
@public
@extern("atoi") @convention("C");
fn puts(text: const array[char]) s32
@public
@extern("puts") @convention("C");
fn main() s32 @public {
if puts("interop ready") < 0 {
return 1;
}
return 0;
}
Condicionales en Compile-Time
Usa @if, @elif y @else para elegir codigo por plataforma al compilar.
@if(isLinux()) const PLATFORM: u32 = 2;
@elif(isWindows()) const PLATFORM: u32 = 1;
@else const PLATFORM: u32 = 3;
fn main() s32 @public {
var count: s32 = 0;
@if(false) {
count += 1;
} @elif(true) {
count += 2;
} @else {
count += 100;
}
return count;
}
Imports Utiles
Combina modulos de std::, aliases e imports selectivos para mantener dependencias explicitas sin ensuciar el archivo.
import std::io;
import std::math;
import std::collections::vector;
fn main() s32 @public {
var values := vector::newVector[s32]();
var angle: f64 = math::PI_4;
vector::pushBack[s32](ref values, 10);
vector::pushBack[s32](ref values, 20);
io::print("last=%d cos=%f\n", vector::back[s32](ref values), math::cosine(angle));
vector::destroyVector[s32](ref values);
return 0;
}
import "other.thrust" as dep;
import "other.thrust" only { stack, counter };
import module_a::sub::module_b;
fn main() s32 @public {
var value: module_a::sub::module_b::MyType = 0;
if counter > 0 {
return value as s32;
}
return 0;
}
Builtins Utiles
Builtins de tipos/layout como sizeOf, alignOf e isSameType.
const U32_SIZE: usize = sizeOf(u32);
const U32_ALIGN: u32 = alignOf(u32);
const U32_BITS: usize = typeWidth(u32);
const PTR_BITS: usize = pointerWidth();
const COMPILER_LEN: usize = stringLength(compilerVersion());
fn verifyTypes() void {
staticAssert(isSameType(u32, u32), "u32 type check failed");
}
struct Header @public {
magic: u32,
count: u16,
flags: u16
}
const HEADER_SIZE: usize = sizeOf(Header);
const HEADER_ALIGN: u32 = alignOf(Header);
fn validateLayout() void {
staticAssert(HEADER_SIZE >= 8, "Header layout is too small");
staticAssert(HEADER_ALIGN >= 2, "Header alignment is too small");
}