## プログラムの文法

トップ > プログラムの文法

Protraではチャートやシステムを記述するのに独自の言語(以後Protra言語と呼ぶ)を使用します。言語やプログラムと聞くと難しいと感じるかもしれませんが、Protra言語は文法の事項がとても少ないので簡単に修得できるはずです。

#### プログラムの構成

プログラムは文を並べたものです。文と文の間は`;`または改行で区切ります。ただし、`\`か`_`に続く改行は無視されます。文は関数呼び出しや代入などの式や、制御文や関数定義文からなります。

libディレクトリ以下に置かれたライブラリを読み込むときには、`#include <`ライブラリ名`>`か`require "`ライブラリ名`"`を用います。ライブラリ名はライブラリのファイル名から拡張子.ptを除いたものです。

#### データ型

Protra言語で扱う型は int, float, string, null の４種類だけです。

#### 定数の表記法

データ型の項で述べたそれぞれの型の定数は次のような記法で表すことができます。

    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

1. 条件式1が真ならば処理1が実行されて終了する。
2. 条件式1が偽のとき条件式2が真ならば処理2が実行されて終了する。
3. 条件式1が偽のとき条件式2が偽ならば処理3が実行されて終了する。

以上のような動作をします。ただし、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言語で最も重要な仕組みです。システムプログラム用などに独自のテクニカル指標を関数として定義した場合に大きな効力を発揮します。@作用素の強力な恩恵にあなたは必ず驚くはずです。

Copyright (C) 2003 Daisuke Arai.
Copyright (C) 2008 panacoran.
This document may be used under the term of the GNU General Public License version 3 or higher.