AQUA言語仕様
1)数式

 AQUA言語における全ての数式は、@@から始まり、;(セミコロン)で終わります。文を複数行に渡って記述することはできません。
文には必ず1つの命令を含みます。命令は全て小文字で記述します。 数式は@@let命令・@@if命令・@@loop命令・関数文・代入文で使えます。
その他の命令文では代入や演算など数式は使えません。
全ての命令の構文は、以下の通りです。

命令文@@command[:parameter1[,parameter2[,...,paramtern]]];
関数文@@&function([parameter1[,parameter2[,...,paramtern]]]);
代入文@@value1=value2;

 [ ]内は、必要が無ければ省略可能です。
命令文commandの後の:は空白で代用可能です。
代入文なら@@letを省略出来ます。

<%
command[:parameter1[,parameter2[,...,paramtern]]];
value1=value2;
%>
スクリプト開始タグとスクリプト終了タグに挟まれている場合@@は省略して記述して下さい。

2)変数

 AQUA言語で変数名に使用できる文字は、以下の通りです。
半角英数字 a〜z,A〜Z,0〜9,_
全角文字 ひらがな、カタカナ、漢字など

変数や配列変数は宣言しなくても使用する事が出来ます。
参照取得演算子を使う事で、変数の参照を取得する事が出来ます。
例 @@ref = #v; @@ref = 1; (参照変数refを更新すると変数vの内容が更新される)
参照の解除と使用メモリの開放を行うにはnullを代入します。例 @@ref = null;

 変数の使用には、いくつかの制限があります。

○変数名の先頭に数字は使えない。 変数名は、半角英字か全角文字で始まっていなければなりません。変数名の一部として「.」ドットを含める事は出来ません。ドットを含めた場合はネームスペース指定として解釈されます。
○配列変数は一次元のみ。 配列変数は、一次元のみで多次元の指定を行うとエラーが発生します。例 @@array[index] = 123;
配列のインディクスに使用可能なのは0〜1000で、個数にすると1001です。

○演算に使用する変数名に使用できる文字は基本的には全角・半角英数字のみ。 演算とは、let命令・if命令・loop命令の引数に指定する式です。この式の中で使う変数は、全角・半角英数字のみで構成された名前でなければなりません。@@if:[テスト] eq "";のように[ ]で囲んで可読性の向上が可能です。
○予約変数名は使えない。
 null以外の予約変数は、使っても構わないが予期しない動作を引き起こす可能性があります。予約変数は以下の通りです。(特定の命令で使用します)
ao bt ce ck dk dv ff fk
fl fn fw gl go ht ls mc
mi od ra rk rm rs rv sc
si sl sm sq wk wv   null

3)オブジェクト指向

AQUAのオブジェクト指向は、クラス定義するタイプです。
@@class命令で、クラス定義の始点を表して、@@endclassで定義の終点を表します。
下記はクラスaを定義してメンバー変数strとメンバー関数funca(v1)を定義します。

@@class a;
 @@entity string str;
 @@parts funca(v1);
  メンバー関数[@@?v1;]
 @@endparts;
@@endclass;

定義したクラスは@@entity命令で、使用宣言する必要があります。
@@entity a v; @* 変数vを変数宣言
使用宣言すればメンバー関数funca(v1)は@@&v.funca("TEST");のように使用できます。
関数コールは&記号に続けてメンバー名を記述する必要があるので注意が必要です。
メンバー変数strは@@v.str = "ABC"のように使用出来て、普通の変数のように値の代入
と値の取得が可能です。

継承は@@class [クラス名] [親クラス名];で行います。
下記のように記述すればaクラスを継承してbクラスを作成可能です。

@@class a;
 @@entity string str;
 @@parts funca();
  @@this.str = "A1";
  [@@?this.str;]メンバー関数A1
 @@endparts;
@@endclass;
@@class b a;
 @@parts funca();
  @@this.str = "A2";
  [@@?this.str;]メンバー関数A2
  @@&super.funca();
 @@endparts;
@@endclass;

継承した同名のメンバー関数をコールする必要がある場合はsuperキーワードを
使用します。
自分自身のメンバー変数と継承したメンバー変数はthisキーワードを使用します。

オブジェクトを生成するための前処理やオブジェクトを消滅させるための後処理を
記述出来るコンストラクタとデストラクタの定義が可能です。
コンストラクタとデストラクタは下記のように記述します。

@@class a;
 @@entity string str;
 @@parts funca();
  メンバー関数A
 @@endparts;
 @@parts a();
  コンストラクタA
 @@endparts;
 @@parts ~a();
  デストラクタA
 @@endparts;
@@endclass;

コンストラクタを定義する為にはクラスと同じ名前のメンバー関数を記述します。
デストラクタを定義する為にはクラスと同じ名前に~記号を加えた名前のメンバー
関数を記述します。
継承した場合の親クラスのコンストラクタとデストラクタは暗黙で呼ばれます。

4)ユーザ関数

 ユーザ関数(サブルーチン)は@@parts functionname(value);で始まり@@endparts;で 終わる一連の命令で囲む事で定義します。
関数名前(functionname)が同一だが引数の数が異なる関数は多重定義として解釈されます。
明示的に関数名前(functionname)と引数の数が同じ場合は、古い定義を完全に置換える再定義として解釈されます。
関数呼出は前方参照が可能ですが、継承は前方参照が出来ません。

サブルーチン例
@*---------------------------------
@@parts printvalue(v);
 @@view:v;
 @@ret=v;
 @@return:ret;
@@endparts;
@*---------------------------------

多重定義サブルーチン例
@*---------------------------------
@@parts printvalue(v,sp);
 @@view:v;@@view:sp;
 @@ret=v;
 @@return:ret;
@@endparts;
@*---------------------------------

継承サブルーチン例
@*---------------------------------
@@parts printx(v)printvalue;
 @@v=v*2;
 @@&:printvalue(v);
@@endparts;
@*---------------------------------

 C言語のライブラリ(DLL)やAPIを@@declare lib命令で関数として利用できます。
ポインタを扱う場合はC言語の知識が必要です。
例 @@declare lib "GetComputerName","kernel32.dll","long GetComputerNameA(char *lpBuffer,long *nSize)";

5)フォーム変数

 フォームで入力された値は、name 属性に設定された名前を変数名とする変数に代入され、利用することができます。
フォーム変数のネームスベース(名前空間)は「form」です。
スクリプト中でネームスペースが変更されなければ、グローバル変数も「form」空間に格納されます。

6)ページ間グローバル化変数

 global命令を使ってグローバル化した変数は、リンク@@url;やフォーム@@form;などでページを移動しても保持されます。

7)ネームスペース

 グローバル変数の名前の衝突を、防ぐネームスペースが使用出来ます。
@@namespace:[空間名];命令でネームスペース(空間名)を指定できます。
標準のネームスペース(名前空間)は「form」です。
ネームスペース(名前空間)は使う前に「@@namepart」命令で使用宣言する必要があります。例 @@namepart name;
@@call:命令を使用してサブルーチン的にインライン展開した場合は、前後処理によって現在の ネームスペースが保存されるので呼出先でネームスペースを変更しても呼出元には影響がありません。
変数名をドットで区切る事によってネームスペースを個別に指定出来ます。
「foo.a」はfooと言う名前空間のaと言う変数になります。
変数名でネームスペースを省略した場合は、現在のネームスペースに所属する変数として処理されます。
例えば@@namespace:foo;@@a = 1;と@@foo.a = 1;は同じ結果になります。

8)ローカル変数・グローバル変数

 ローカル変数は、ネームスペース(名前空間)のローカルに所属する変数です。
@@namespace:local;でネームスペース(名前空間)がローカルに切り替わります。
グローバル変数は、ローカル以外のネームスペースに所属する変数です。

9)コメント

 コメントは処理もされず、ブラウザ上で表示もされません。

省略記述として @* と @@// 形式の行末コメントもサポートしています。
プログラムの見易さ、デバッグ作業の効率化のためできるだけつけるようにしてください

@@// 行末までコメント
@* 行末までコメント
 →プログラム処理には反映しません。


<%
// 行末までコメント
%>
 →スクリプト開始タグとスクリプト終了タグに挟まれている場合は//形式の
使用を推奨します。



AQUA言語スクリプト命令体系
■非データベース命令形
 
 データベースにアクセスしない命令系統です。処理の複雑さ、使用頻度等によって以下の2種類に分かれます。

基本命令  AQUA言語でプログラムを構築する上での基本の命令となります。変数値代入の@@set; @@let;、条件分岐命令の@@if;、他には繰り返し処理の@@loop等もこれに含まれます。
応用命令  こちらの命令はより高度なプログラム構築の上で使われる命令です。処理にロックをかける@@lock; やファイル操作を行う命令の@@file; もこれに含まれます。

■データベース命令形

 直接データベースファイルとの間に入って処理するのがこの命令系統です。標準的な処理のSQL系DB命令と簡単に処理を記述できる簡易DB命令の2種類に分かれます。

簡易DB命令  こちらの命令はすべて@@db〜;で記述が始まります。こちらは1データベース1テーブルにアクセスする機能しか持たない代わりにSQLの知識が無くてもデータベース操作が可能になります。
SQL系DB命令  こちらの命令はすべて@@sql〜;で記述がはじまります。こちらの命令を使うにはSQLの知識が必要になります。





















.