Примеры
Четыре короткие программы. Каждая — законченный файл: скопируйте одну в
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 — тот же класс отказа.