Welcome to the Margarine language tutorial! This guide will take you from the basics to advanced features, with runnable examples. To run any example, save it to a file (e.g., hello.mar) and run:
cargo r run hello.mar
fn main() {
print("Hello, world!");
}
var x = 42;
var y: float = 3.14;
var name = "Margarine";
fn add(a: int, b: int) -> int {
return a + b;
}
fn main() {
print(add(2, 3));
}
fn main() {
var x = 10;
if x > 5 {
print("x is large");
} else {
print("x is small");
}
}
fn main() {
var x = 2;
match x {
1 => print("one"),
2 => print("two"),
_ => print("other"),
}
}
fn main() {
for i in 0..5 {
print(i);
}
var x = 0;
while x < 3 {
print(x);
x += 1;
}
loop {
break;
}
}
struct Point { x: int, y: int }
fn main() {
var p = Point { x: 1, y: 2 };
print(p.x);
}
enum Option<T> { Some: T, None }
fn main() {
var x = Option::Some(42);
match x {
Option::Some(val) => print(val),
Option::None => print("none"),
}
}
trait Display { fn show(self) -> str; }
struct User { name: str }
impl Display for User {
fn show(self) -> str {
return self.name;
}
}
fn main() {
var u = User { name: "Alice" };
print(u.show());
}
fn identity<T>(x: T) -> T { return x; }
fn main() {
print(identity(123));
print(identity("abc"));
}
mod math;
fn main() {
print(math::add(1, 2));
}
extern "https://example.com/repo" as ext;
use ext::lib;
fn main() {
print(lib::external_function());
}
fn main() {
var (a, b) = (1, 2);
print(a);
print(b);
}
@test
fn some_test() {
assert(3 == 3, "what?")
}
Compile-time errors are reported with source locations. For runtime errors, use Option, Result, and pattern matching.
fn main() {
var add = |a, b| a + b;
print(add(2, 3));
var xs = [1, 2, 3];
print(xs[0]);
}
struct Counter { value: int }
impl Counter {
fn inc(self) -> Counter {
return Counter { value: self.value + 1 };
}
}
fn main() {
var c = Counter { value: 0 };
c = c.inc();
print(c.value);
}