Intro Blog

プログラミング言語を作っています

IntroJS におけるブロック構造の書き方

IntroJS では、Ruby 風にブロックの終わりを end で示します。

ブロックの始まりは、def, if, for, while などになります。

インデントは、空白文字 (半角空白、水平タブ) 何個でもよく、そろえる必要もないですが、 半角 2 文字と推奨としています。

ということで、整数型しか使えない簡易プログラミング言語 IntroJS は、いかがでしょうか。

IntroJS

IntroJS でテストファーストを実践してみる

IntroJS の自動テスト機能を使って、テストファーストを実践してみます。

例題として、簡単な足し算プログラムを作ります。

入力データ仕様は、1 行目と 2 行目に整数 1 つずつとします。

出力データ仕様は、入力データの 2 つの整数を足したものを 1行目に 1つ出力するとします。

まず、空のソースコードファイル add.intro を作成しておきます。

def main()
end

次に、add.intro ファイルを作成したディレクトリに、case1 ディレクトリを作成します。 そして、その case1 ディレクトリの中に、次のように入力データファイル input.txt を作成します。

1
2

同様に case1 ディレクトリの中に、出力データファイル output.txt を作成します。 足し算プログラムが正しく動作したときの出力データを記述します。 ここでは、入力データの 1 + 2 の結果 3 となります。

3

ここで、一度、自動テストを実行してみます。

introjs -t add.intro

まだ、ソースコードに何も処理を書いていないので、エラーが表示されるはずです。

とりあえず、テストが成功するようにするため、add.intro を次のように修正します。

def main()
  write_int(3)
end

再度、自動テストを実行します。

introjs -t add.intro

今度は、テストが成功するはずです。 ただし、このままでは、他のテストケースでは、うまく動作しないはずです。

もうひとつテストケースを作成するため、case2 ディレクトリを作成し、 その中に input.txt と output.txt を作成します。

case2 の input.txt は次のようにします。

2
3

case2 の output.txt は次のようにします。

5

テストを実行します。

introjs -t add.intro

case 1 は成功しますが、case2 は失敗するはずです。 add.intro を修正して、足し算を正しく計算するプログラムにしましょう。

def main()
  var a = read_int()
  var b = read_int()
  write_int(a + b)
end

テストを実行します。

introjs -t add.intro

すべてのテストケースに成功するはずです。

こうして、無事、足し算プログラムをつくることができました。

このように、テストケースを先に作成してから、ソースコードを作成する手法は、テストファーストと呼ばれています。

ということで、整数型しか使えない簡易プログラミング言語 IntroJS は、いかがでしょうか。

IntroJS

IntroJS の自動テスト機能

IntroJS には、競技プログラミング風の自動テスト機能が組み込まれています。

次のようなファイル構成でソースコードとテストデータを作成します。

├─example.intro
├─case1
│ ├─input.txt
│ └─output.txt
└─case2
  ├─input.txt
  └─output.txt

case ディレクトリは、一つのソースコードについて、複数の case ディレクトリを作成できます。 case ディレクトリの名前は、case1, case2 など case で始めます。

input ファイルは、プログラムの入力となるデータを空白区切りのテキストファイルです。 input ファイルの名前は input.txt のように、input で始めます。

output ファイルは、プログラムが正しく動作したときの出力データを表した空白区切りのテキストファイルです。 output ファイルの名前は output.txt のように、output で始めます。

自動テストを実行するには、次のコマンドを実行します。

introjs -t example.intro

いかがでしょうか。

IntroJS のインストール

IntroJS は、Node.js 上で動作します。 Node.js をインストールして、以下のコマンドを実行してください。

npm install -g introjs

インストールできたことを確認するには、以下のコマンドを実行してみてください。 ヘルプが表示されれば、インストールは成功しています。

introjs -h

メモ帳などのテキストエディタで、以下のようなプログラムを作成してください。 ファイル名は、example.intro としておきます。

def main()
  write_int(42)
end

以下のコマンドを実行して、作成したプログラムを実行します。

introjs example.intro

いかがでしょうか。

なぜ、整数型しか使えないプログラミング言語を作ったのか。

スマホでプログラミングが楽しめるアプリを作りたいと思って、 Scratch のようなブロックを組み立てるビジュアルプログラミング方式を考えていたのですが、

  • ブロックや、テキストボックスを指でチマチマ操作するのがしんどい
  • 作成したプログラムが読みにくい
  • 実装が困難

ということで、いきなり諦めました。

とりあえず、まずはテキスト入力でよいだろうと。

そこで、スマホ向けのプログラミング言語を作ろうと思ったのですが、

  • 実装が困難

ということで、機能を削りに削った結果、 いつの間にか、整数型しか使えないプログラミング言語を作っていました。

IntroJS

いかがでしょうか。