サンプル
四つの短いプログラム。それぞれが完全なファイルである —— ひとつを 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 を見よ。