コンテンツにスキップ

はじめる

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の組み込み関数を使います。

リポジトリへアクセスできるGitHubアカウントで取得し、プロジェクトのルートでビルドします。

ターミナルウィンドウ
git clone https://github.com/Twil3akine/tekri.git
cd tekri
cargo build --release --offline

以降のコマンドは、このtekriディレクトリで実行します。まず、同梱の合計プログラムを確認して実行します。

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

checkはexamples/sum.tkr: OKを出力します。runはC++への変換とコンパイルを行い、入力された5個の整数を足します。

15

次の内容を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++を読む場合はemit、何度も実行する実行ファイルを作る場合はbuildを使います。

ターミナルウィンドウ
./target/release/tekri emit main.tkr -o main.cpp
./target/release/tekri build main.tkr -o main
printf '8 13\n' | ./main

runは呼び出すたびにコンパイルし、生成物を一時ディレクトリへ置きます。コマンドと出力先の詳細はCLIを参照してください。

tekriコマンドをインストールする

Section titled “tekriコマンドをインストールする”

毎回./target/release/tekriと書く代わりに、Cargoでインストールできます。Cargoのインストール先がPATHに含まれる環境で使ってください。

ターミナルウィンドウ
cargo install --path . --offline
tekri --version
tekri check examples/sum.tkr

このサイトのコマンド解説は、以降tekriがPATHから実行できるものとして記載します。インストールしない場合は./target/release/tekriへ読み替えてください。

次はサンプル集で、合計・最大公約数・フィボナッチ数を試せます。元の導入手順はリポジトリのREADMEにも記載しています。