はじめる
tekriは、競技プログラミング向けに短く書ける言語を目指す、C++20へのトランスパイラです。整数・真偽値、関数、条件分岐、ループ、基本的な入出力を扱えます。
| ツール | 用途 |
|---|---|
| Git | リポジトリの取得 |
| Rust / Cargo | tekri本体のビルド。Rust edition 2021を使います |
| GCCまたはClangのC++20対応コンパイラ | build・runによる実行ファイルの作成 |
checkとemitは、C++コンパイラなしで使えます。tekri本体にRustの外部クレート依存はありません。生成するC++は標準ヘッダを使い、bits/stdc++.hには依存しません。整数演算の検査にはGCC / Clangの組み込み関数を使います。
ソースからビルドする
Section titled “ソースからビルドする”リポジトリへアクセスできるGitHubアカウントで取得し、プロジェクトのルートでビルドします。
git clone https://github.com/Twil3akine/tekri.gitcd tekricargo build --release --offline以降のコマンドは、このtekriディレクトリで実行します。まず、同梱の合計プログラムを確認して実行します。
./target/release/tekri check examples/sum.tkrprintf '5\n1 2 3 4 5\n' | ./target/release/tekri run examples/sum.tkrcheckはexamples/sum.tkr: OKを出力します。runはC++への変換とコンパイルを行い、入力された5個の整数を足します。
15最初のプログラム
Section titled “最初のプログラム”次の内容をmain.tkrとして保存します。トップレベルに実行する文を書けるので、main関数の定義は必要ありません。
fn larger(a: i64, b: i64) -> i64 { a > b ? a : b}
read x: i64, y: i64;answer = larger(x, y);print answer;printf '8 13\n' | ./target/release/tekri run main.tkr出力は次のとおりです。
13このプログラムでは、次の規則を使っています。
readは空白区切りの整数を読みます。ここではi64を指定しています。answer = ...;は、見えている同名の変数がなければ定義し、あれば更新します。letは使いません。a > b ? a : bは三項演算子です。選ばれた側だけを評価します。- 関数の最後の式には
;を付けず、その値を返します。 printは値を出力して改行します。
C++や実行ファイルを残す
Section titled “C++や実行ファイルを残す”生成したC++を読む場合はemit、何度も実行する実行ファイルを作る場合はbuildを使います。
./target/release/tekri emit main.tkr -o main.cpp./target/release/tekri build main.tkr -o mainprintf '8 13\n' | ./mainrunは呼び出すたびにコンパイルし、生成物を一時ディレクトリへ置きます。コマンドと出力先の詳細はCLIを参照してください。
tekriコマンドをインストールする
Section titled “tekriコマンドをインストールする”毎回./target/release/tekriと書く代わりに、Cargoでインストールできます。Cargoのインストール先がPATHに含まれる環境で使ってください。
cargo install --path . --offlinetekri --versiontekri check examples/sum.tkrこのサイトのコマンド解説は、以降tekriがPATHから実行できるものとして記載します。インストールしない場合は./target/release/tekriへ読み替えてください。
次はサンプル集で、合計・最大公約数・フィボナッチ数を試せます。元の導入手順はリポジトリのREADMEにも記載しています。