PWS2002のプログラミング書式

2002-09-11

PWS 1.5用の言語仕様

現在のところ、PWS2002 用の PDK は Ver.2.00暫定版1が公開されている。 簡単なリファレンスも同梱されているが、内容は PWS2002 で拡張された標準関数に限られ、また日本語になっていない部分が存在するなど内容も不完全。 いかにも「作りかけ」という感じの仕上がり。 まぁ、暫定版なので、目くじら立てる事でもないだろう。 ずーっと暫定版なのは困るが。

で、PWS 1.5 用の言語仕様を読む事になるわけだ。 ブツは「『ペルソナウェアならびに綾織言語仕様 1.50版』アーカイブ(2001/10/26)」。 プ社のサイト から「キャラクター開発ガイド」→「キャラクター開発キットについて」より入手可能。

以下、自分用のメモ。(←得意だな)
あまり見るべきものがない項目もあるが、とりあえず目次に沿ってメモメモ。φ(._.)m

式と文

変数・定数・関数などを演算子で結んだものが「式」。
式の終わりに ;(セミコロン) を付けたものが「文」。

いまいち定義がハッキリしないのが「条件式」なんだが、どうやら boolean型の値を返す式の事のようだ。 関係演算子を使った評価結果を想定しているように思える。 単独の boolean型変数も該当する。

アクション

ペルソナの一連の挙動を「アクション」と呼ぶそうだ。
でも、実際には「ペルソナの一連の挙動」は、1つ以上のアクション群から成っているんだよね。 一連の挙動を「アクション」と定義してしまうと、個々の action@(){ … } は、どう呼べばいいのだろう? ま、言葉(用語)の問題だけで、実害はないけど。

アクションの書式は、次のようになる:

action アクション名@( 起動条件 )
{
    そのアクションの処理;
}

起動条件は boolean型の式。 この起動条件はペルソナウェアが毎秒チェックしていて、起動条件が成立していたら当該アクションが実行される。 ただし、毎回起動条件が成立する場合は、初回以外は無視される。 起動条件はプログラマが自由に指定できるが、例えば「クリックされた」と言った具合に、起動条件が予め決められている「標準アクション」も存在する。

「条件を指定して実行」する事がアクションの特徴。
つまり、イベントハンドラとして使えって事なんだろう。

関数

引数返値を取れるアクションを「関数」と呼ぶようだ。 アクションは手続き(procedure:プロシージャ)相当であると書いてあるが、これに対応する言葉が "関数"や"機能"(function:ファンクション)。 まぁ言葉はどうでもいいんだが。

関数の使いどころは、いわゆるサブルーチンか。 イベントハンドラから呼び出される処理は、すべて関数で記述するべしと言っているように思える。 別にサブルーチンをアクションで書いても構わないんだが、関数とアクションの使い分けの観点からするとスッキリしないような…。

関数の書式は、次のようになる:

関数型 関数名( 引数型 引数名 [[,引数型 引数名]...] )
{
    関数の処理;
    return 返値;
}

ところで、なぜか関数の型が明記されていない。 下のほう、変数の解説によると int, double, char, string, boolean が取れるようなんだが。 また、Critical修飾子の解説によると void も OK のようだ。 ハッキリ書かないのには、何か意味があるのだろうか?

変数と定数/配列

変数型

変数の型は int, double, char, string, boolean の5種類。
0.93系と同じ程度の処理であれば、int, string, boolean が使えれば不自由しないと思われる。

スコープ

変数にスコープの概念が導入された。 平たく言えば、変数の「有効範囲」の事だな。 { } (以下"ブロック")の中で宣言した変数(←ただしブロックの先頭で宣言する必要がある)が、宣言したブロックの中だけで有効というルールのようだ。 どのブロックにも属さないものはグローバル。

単純に慣れの問題だと思うが、個人的には「関数の中で有効」は許せても、「ifの thenブロックの中で有効」は違和感がある。 まぁ、グローバルと(関数内)ローカルの2本立てで困ることも無いだろうから、しばらくはその解釈で行こう。

定数

定義済み定数についてのみ、記述あり。

true, false は boolean型の値。
NULL は string型関数の返値。

NULL と ""(長さ0の文字列)は違う、とも書いてある。

それはそうと、期待していたのとは違ったのが非常に残念。 C言語の #define みたいな感じで、即値に名前を付けたかったんだけど。 過度な期待だろうか?(プリプロセッサがあるのに?)

配列

比較的長い説明がある割りに、見るべきものは無し。
宣言の時に初期化できると固定値のテーブルを作るのに便利なんだが、出来ないらしい。

演算子

ごく普通の演算子。
相変わらず、論理演算ができないようだ。

あぁ、ここで言う"論理演算"は、NOT, AND, OR, XOR, bitシフト, bitローテート といった演算の事ね。 仕様に書かれている論理演算は boolean型の演算(だと思われる)ので、少し意味が違う。 例えば 16 と 1 で OR を取ると 17 になるが、0.93系では 1 が返っていた。 この論理から想像するに、true 辺りが返るんじゃないかと。

フラグの処理なんかでは必要不可欠なんだがなぁ。 配列を使えって事なんですかねぇ?

制御構造

0.93系には無かった多方向分岐(switch-case)が使えるようになった。 else if を列挙するのに比べると、ソースがスッキリしそうな感じ。 あと、存在しながら説明されていなかった break が、ちゃんと説明されている。

構文日本語名注意点など
if-else 判断  
while 前判定反復  
for 所定回反復  
switch-case 多方向分岐 switch はint型演算,case はint型定数のみ
break 飛び越し while, for switch からの脱出
AddItem-Choice ユーザ選択分岐 

エスケープシーケンス

エスケープ「シーケンス」と言うよりは、エスケープ「文字」では?といった内容。

\n … 改行
\\ … \記号
\" … "記号

PWS 0.93 では Talk() の中で使う "制御文字" があった程度。 もちろん PWS 1.5 でも Message()Talk() の中で使う "制御文字" は存在し、強化もされている。 上記の \n はそのまま、\\ は \\\\ として登場するのだが、両者の違いはイマイチ分からない。

また、ありがちな \ を含む文字(構,表 など)がきちんと処理できるのかどうかも謎。 仕様的には、"一覧\表" などと書く必要は無さそう。 出るとすれば、実装の問題か。

コメント

行の途中で // を入れると、それ以降行末まではコメント。
/* と */ に囲まれた区間はコメント。

これまでと同じ。

引数型/返値型

関数の引数や返値には型があるという話。
異なるデータ型を使う場合は、型変換関数で変換する。

PWS 0.93 の頃から itoa()atoi() は存在したので、特に目新しい事はなし。 単に double 型用に拡張されたということ。

#import

C言語で言う #include ですな。
物理的に分割されたソースファイル(*.aya)を、論理的なひとつのファイルにまとめる道具。 実質的にプロトタイプ宣言を取り込むのが目的のようだが、まだアクションや関数の順番を気にする必要があるのかな?

extern とプロトタイプ

分割コンパイルが可能。
別モジュールで宣言されているモノを参照するには:

変数       … extern 変数型 変数名;
アクション … extern action アクション名;
関数       … 関数型 関数名( 引数型 引数名, ... );

関数のやり型を、プロトタイプ宣言と言う。 ユーザ定義関数の場合はもちろん、標準関数を使用する際にもプロトタイプ宣言が必要。 PDK に付属しているので、#import して使う事になる。

PWS 1.5 では(おそらく PWS2002 でも)、ペルソナデータディレクトリに在る *.exa を全部読込もうとするらしい。 PWS 0.93 のように連番である必要はなく、またファイル名の制約もない模様。

Critical修飾子

処理の優先順位を定義する道具。
Critical修飾子は、アクション/関数全体を対象にする記述。
CriticalSection は、アクション/関数内の一部を対象にする記述。

優先順位は「normal」「critical」の2種類しかない。 また、「critical」な処理が走る時、処理中の「normal」処理はキャンセルされるそうだ。 これだと、「normal」の処理は「いつ中断しても大丈夫」な様に書いておく必要がある。 そんな書き方、ちょっと出来そうにもないな。 よって、多分使わないだろう。

import, export

プラグイン連携用。 今の所、関心なし。

0.93系からの移行は可能だろうか?

これだけ読む分には、PWS 0.93 との共通点も多いようだ。
これなら、PWS2002 ネイティブ対応のキャラクターを作る事も不可能では無さそうかな?

でも、PWS 0.93 の頃から比べると、やたら標準関数が増えている。 まぁ 0.93 のも初めは多く見えたものだが、それにしても多い。 0.93→1.5 の増分に加え、1.5→2002 の増分まで一度に覚えなくてはイカンとは。 ちと荷が重いなぁ。 或る程度自分なりの"使いどころ"が決まってくれば楽だと思うんだが、それまでは PWS 0.93 相当の辺りをちょこちょこいじってみるしか無いか。

上の方でも触れているが、プリプロセッサ(ayap)の役割が少々残念。 軽く考えただけでも、C言語の #define を使った定数は欲しいし、#ifdef による条件分岐も必要そう。 プロトタイプ宣言するなら、必須だと思うのだが…。 暫定版から正規版に移行する場合は、是非盛り込んで欲しいものだ。

  1. Ver.2.00暫定版
    執筆当時。 2004/03/19現在、PDK Ver.2.01a が正式に公開されています。

Copyright© 1998-2006 Hira