Protraではチャートやシステムを記述するのに独自の言語(以後Protra言語と呼ぶ)を使用します。言語やプログラムと聞くと難しいと感じるかもしれませんが、Protra言語は文法の事項がとても少ないので簡単に修得できるはずです。
プログラムは文を並べたものです。文と文の間は;または改行で区切ります。ただし、\か_に続く改行は無視されます。文は関数呼び出しや代入などの式や、制御文や関数定義文からなります。
libディレクトリ以下に置かれたライブラリを読み込むときには、#include <ライブラリ名>かrequire "ライブラリ名"を用います。ライブラリ名はライブラリのファイル名から拡張子.ptを除いたものです。
Protra言語で扱う型は int, float, string, null の4種類だけです。
データ型の項で述べたそれぞれの型の定数は次のような記法で表すことができます。
int 0, 12, 123, ... float 0.0, 12.345, ... string "Protra", "program" ... null null
0およびnullは偽、その他はすべて真と解釈します。
変数にはグローバル変数とローカル変数があります。グローバル変数は$から開始される名前でなければなりません。ローカル変数は小文字のアルファベットから開始される名前でなければなりません。以下に例を挙げます。
グローバル変数 $global, $Global, $g_val, ... ローカル変数 local, local2, l_val, ...
ローカル変数は初期化されていないとエラーになりますが、グローバル変数は突然使用された場合は値がnullとなります。演算は基本的にC言語やJavaと同じですが、++や+=などの特殊なものは使用できません。
繰り返しや条件分岐を表現するための最小限の制御文としてwhile文, if文が定義されています。
while文は処理を繰り返すための文であり、次の記法で表されます。
while 条件式 処理 end
if文は条件分岐のための文であり、次の記法で表されます。
if 条件式1 処理1 elsif 条件式2 処理2 else 処理3 end
以上のような動作をします。ただし、elsifはいくつでも追加できるし省略も可能です。
配列は次のような式により生成されます。
[要素数]
これで要素数で指定した数の要素を持つ配列ができます。インデックスは0から始まり、初期化時の配列はすべてnullで満たされています。例として100個の要素を用意し、1から100を順に代入するプログラムを示します。
arr = [100] i = 0 while i < 100 arr[i] = i + 1 i = i + 1 end
関数は処理をまとめるための仕組みであり、次の記法で表されます。
def 関数名(引数1, 引数2, ...) 処理 end
関数名は大文字のアルファベットから始まらなければならないので注意して下さい。また、各引数は関数の内部だけで有効なローカル変数となります。
例として1から100までの和を計算する関数Sum100を定義し、変数sumにSum100を呼び出して値を代入するプログラムを示します。
(例1) def Sum100 i = 1 sum = 0 while i <= 100 sum = sum + i i = i + 1 end return sum end sum = Sum100
また、1からnまでの和を計算する関数Sumを定義し、変数sumにSumを呼び出して1から100までの和を代入するプログラムを示します。
(例2) def Sum(n) i = 1 sum = 0 while i <= n sum = sum + i i = i + 1 end return sum end sum = Sum(100)
(例1)で見られるように、引数が無い場合は関数の定義および呼び出しにおいて()は省略することができます。値を返すときはreturnで指定する必要があり、これを書かない場合はnullが返されます。
関数に渡されるローカル変数は引数のリストとして書かれるものだけではなく、関数は暗黙のうちにatという変数を引数として与えられて呼び出されます。何の指定もしないで関数呼び出しを行った場合atの値は0です。atを明示的に指定したい場合は@作用素という次のような記法を使います。
{int型の式}式
{}内部の値が@作用素の値です。int型でないとエラーになるので注意して下さい。例としてatからn個の数の和を計算する関数ShiftSumを定義し、変数sumに101から200までの和を代入するプログラムを示します。
def ShiftSum(n) i = 1 + at n = n + at sum = 0 while i <= n sum = sum + i i = i + 1 end return sum end sum = {100}ShiftSum(100)
@作用素の最も重要な特性は、式内部の(木構造的な)末端の関数まで作用素が伝播するという性質です(作用素という名前はこのような数学的特性からきている)。例えば、次の4個の式はすべて同じ値となります。
(1) {1}Func1 + {2}Func2 + 2 (2) {1}(Func1 + {1}Func2 + 2) (3) def Func return {1}Func1 + {2}Func2 + 2 end Func (4) def Func return Func1 + {1}Func2 + 2 end {1}Func
@作用素はProtra言語で最も重要な仕組みです。システムプログラム用などに独自のテクニカル指標を関数として定義した場合に大きな効力を発揮します。@作用素の強力な恩恵にあなたは必ず驚くはずです。