コンテンツにスキップ

サンプル集

tekriに同梱する4つのプログラムです。すべてトップレベルから実行するため、main関数は必要ありません。ビルド方法ははじめるを参照してください。

以下はリポジトリのルートで実行します。tekriをインストールしていない場合は./target/release/tekriへ読み替えてください。

最初に個数nを読み、続くn個の整数の合計を求めます。入力を一つずつ処理するため、配列は使いません。個数は既定のi32、入力値と合計はi64です。

// Input: n followed by n integers. Uses i64 for the sum.
read n;
sum: i64 = 0;
for i in 0..n {
read value: i64;
sum += value;
}
print sum;

入力:

5
1 2 3 4 5

出力:

15
ターミナルウィンドウ
printf '5\n1 2 3 4 5\n' | tekri run examples/sum.tkr

0..nは終端のnを含みません。readは空白で区切った値を順に読むので、整数の間がスペースでも改行でも同じです。詳しくはループと入出力を参照してください。

ソース: examples/sum.tkr

ユークリッドの互除法を、型付き関数とwhileで書きます。ここでは非負の整数を入力します。

fn gcd(a: i64, b: i64) -> i64 {
while b != 0 {
remainder = a % b;
a = b;
b = remainder;
}
a
}
read a: i64, b: i64;
print gcd(a, b);

入力:

84 30

出力:

6
ターミナルウィンドウ
printf '84 30\n' | tekri run examples/gcd.tkr

関数の引数にも再代入できます。末尾のaには;を付けず、関数の戻り値にしています。readで作るトップレベルのa・bは、関数内の引数とは別の変数です。関数がトップレベルの変数を捕捉することはありません。

ソース: examples/gcd.tkr

F(0) = 0、F(1) = 1とするフィボナッチ数を反復で求めます。i64で結果を表せる0 <= n <= 92の入力を対象にします。

fn fib(n: i32) -> i64 {
if n <= 0 {
return 0;
}
a: i64 = 0;
b: i64 = 1;
for i in 1..n {
next = a + b;
a = b;
b = next;
}
b
}
read n;
print fib(n);

入力:

10

出力:

55
ターミナルウィンドウ
printf '10\n' | tekri run examples/fibonacci.tkr
printf '92\n' | tekri run examples/fibonacci.tkr

2つ目の実行結果は7540113804746346429です。93では計算結果がi64の範囲を超え、加算の桁あふれを実行時エラーとして検出します。最適化ビルドでも整数演算の検査は有効です。

ソース: examples/fibonacci.tkr

三項演算子、値を返すif、ブロック式内のreturn、負数の割り算をまとめた例です。入力は必要ありません。

fn score(x: i32) -> i32 {
result = {
if x < 0 {
return 0;
}
x * 2
};
result + 1
}
x = 7;
y = 12;
print x > y ? x : y;
print if (x < y) { x } else { y };
print score(-1), score(3);
print -7 / 3, -7 % 3, 7 / -3, 7 % -3;
ターミナルウィンドウ
tekri run examples/expressions.tkr

出力:

12
7
0 7
-3 2 -3 -2

return 0;はブロック式だけでなく、score関数全体から戻ります。ifの条件の丸括弧は省略できますが、本体には{}が必要です。

整数の/は負の無限大へ丸める床除算です。%は対応する剰余で、ゼロまたは除数と同じ符号になります。Pythonの//と同じ丸め方を、tekriでは/に割り当てています。詳細は演算子を参照してください。

ソース: examples/expressions.tkr