Loment
日本語

サンプル

四つの短いプログラム。それぞれが完全なファイルである —— ひとつを 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 パッケージでコンパイルし実行した。 ケイパビリティシステム —— フロントページが例を示しているもの —— はこの四つには含まれない。このリリースではリンクしないからだ。それは、言語ではなく セルフホストのリンカにある既知の欠陥である。参照実装は同じプログラムをリンクして実行する。 同じ種類の失敗については イシュー #102 と #38 を見よ。