サンプル集
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;入力:
51 2 3 4 5出力:
15printf '5\n1 2 3 4 5\n' | tekri run examples/sum.tkr0..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出力:
6printf '84 30\n' | tekri run examples/gcd.tkr関数の引数にも再代入できます。末尾のaには;を付けず、関数の戻り値にしています。readで作るトップレベルのa・bは、関数内の引数とは別の変数です。関数がトップレベルの変数を捕捉することはありません。
ソース: examples/gcd.tkr
フィボナッチ数
Section titled “フィボナッチ数”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出力:
55printf '10\n' | tekri run examples/fibonacci.tkrprintf '92\n' | tekri run examples/fibonacci.tkr2つ目の実行結果は7540113804746346429です。93では計算結果がi64の範囲を超え、加算の桁あふれを実行時エラーとして検出します。最適化ビルドでも整数演算の検査は有効です。
式、早期return、床除算
Section titled “式、早期return、床除算”三項演算子、値を返す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出力:
1270 7-3 2 -3 -2return 0;はブロック式だけでなく、score関数全体から戻ります。ifの条件の丸括弧は省略できますが、本体には{}が必要です。
整数の/は負の無限大へ丸める床除算です。%は対応する剰余で、ゼロまたは除数と同じ符号になります。Pythonの//と同じ丸め方を、tekriでは/に割り当てています。詳細は演算子を参照してください。