Loment
RU

Примеры

Четыре короткие программы. Каждая — законченный файл: скопируйте одну в hello.lomt и запустите. То, что вы видите под каждой, — то, что она действительно напечатала.

Самая маленькая программа

_start — там, где начинается машина, и вывод идёт через системный вызов write: дескриптор файла, указатель, длина. Второй вызов — exit.

module hello fn _start() {    let s: str = "hello from Loment\n";    syscall4(1, 1, str_ptr(s) as u64, str_len(s) as u64);    syscall4(60, 0, 0, 0);}

hello from Loment

Функция с возвращаемым значением

Типы выписываются и никогда не выводятся; неявного числового преобразования нет, поэтому целое, которому нужна другая ширина, говорит об этом через as.

module funct fn write_str(fd: u64, s: str) -> i64 {    return syscall4(1, fd, str_ptr(s) as u64, str_len(s) as u64);} fn larger(a: u32, b: u32) -> u32 {    if a > b {        return a;    }    return b;} fn _start() {    let m: u32 = larger(7, 9);    if m == 9 {        write_str(1, "larger(7, 9) came back with 9\n");        syscall4(60, 0, 0, 0);    }    write_str(1, "unexpected\n");    syscall4(60, 1, 0, 0);}

larger(7, 9) came back with 9

Константа и цикл

for идёт по диапазону и связывает индекс. const — это значение времени компиляции, пригодное в качестве границы.

module counting const LIMIT: u32 = 5; fn write_str(fd: u64, s: str) -> i64 {    return syscall4(1, fd, str_ptr(s) as u64, str_len(s) as u64);} fn _start() {    let sum: u32 = 0;    for i in 0..LIMIT {        sum = sum + i;    }    if sum == 10 {        write_str(1, "the loop summed 0 through 4\n");        syscall4(60, 0, 0, 0);    }    write_str(1, "unexpected\n");    syscall4(60, 1, 0, 0);}

the loop summed 0 through 4

Массив, переданный как срез

[u32; 3] — массив с длиной в типе; [u32] — срез, который не несёт собственной длины. &xs передаёт массив как срез, а slice_len спрашивает, какой он длины.

module slice fn write_str(fd: u64, s: str) -> i64 {    return syscall4(1, fd, str_ptr(s) as u64, str_len(s) as u64);} fn sum(xs: [u32]) -> u32 {    let acc: u32 = 0;    let i: u32 = 0;    while i < slice_len(xs) {        acc = acc + xs[i];        i = i + 1;    }    return acc;} fn _start() {    let xs: [u32; 3] = [1, 2, 3];    let s: u32 = sum(&xs);    if s == 6 {        write_str(1, "the slice summed to 6\n");        syscall4(60, 0, 0, 0);    }    write_str(1, "unexpected\n");    syscall4(60, 1, 0, 0);}

the slice summed to 6

Ещё

Репозиторий несёт более крупный набор под loment/examples/. Не все из них компонуются в этом выпуске.

Всё на этой странице скомпилировано и запущено опубликованным пакетом 0.1.4. Системы capability — то, чем открывается главная страница, — среди этих четырёх нет, потому что она не компонуется в этом выпуске. Это известный дефект самоподдерживающегося (self-hosted) компоновщика, а не языка: эталонная реализация компонует ту же программу и запускает её. См. issue #102 и #38 — тот же класс отказа.