minosys script を作ろう (2)
新作 script に取り入れたい言語定義は以下の通りです。
分かりやすい制御構造
別に C がいいという訳ではないのですが、悲しいかな C 以上に
単純な制御構造+式構造が思いつかないので、C から
借りてくることにします。
ただし、do while とか後回しにします。
とりあえず必要な制御構造は以下かな。
- if <評価式> <文1> { else <文2> }
- for (<評価式1>; <評価式2>; <評価式3>) <文>
- while <評価式> <文>
- continue;
- break { <ラベル> };
- global <変数>{=<評価式>};
ラベルと評価式
ラベルと評価式は C の定義をほぼ踏襲します。
ただし、コンマ演算子は定義しません。
クラス定義
カッコ付けて class 定義できるようにしてみます。
class <クラス名> { : <親クラス> } { <インスタンス変数定義> <メンバー関数定義> }
メンバー関数は常にオーバーライド可能とします。親クラスのメンバー関数を
呼び出したい場合は super.<関数名> とします。
クラス変数、static メンバー関数は定義されません。
パッケージ関数が使えるので困ることはないと思います。
インスタンスを作りたい場合はちょっとダサいですが new <クラス名> とします。
関数定義
関数定義は function <関数名>(<引数リスト>) <文>
とし、値を返したい場合は return <評価式>; で表示します。
パッケージ
1ファイル1パッケージとし、import 文でパッケージを取り込むことが
出来るようにします。
HTML でも変数の埋め込み置換が使える
$ 変数記述で置換が使えるようにします。$ 自身を記述したいときは $$ とします。
また関数を呼び出したい場合は $@<関数名>(<引数リスト>)とします。
例:
import "file"; class Counter { $count; Counter() { $f = file.open("/tmp/count", "r"); $count = convert($f.read(), VT_INT) + 1; $f.close(); } save() { $f = file.open("/tmp/count", "w"); $f.write(convert($count, VT_STRING)); $f.close(); } } function init() { global $c = new Counter; $c.save(); } <!DOCTYPE html> <HTML> <head></head> <body> access count: $c.$count </body> </HTML>
ビルトイン関数
パッケージ定義なしで使用できる関数として以下を用意します。
関数名 | 説明 |
---|---|
type | 評価式の型タイプを数値で示す。VT_INT などの列挙値が使える |
convert | 評価式を指定の型に変換する。 |
デバッグ用に指定された値を標準出力に出力する。 | |
exit | プログラムを終了する。引数としてプログラム終了値を指定する。 |
言語仕様が決まったら次はサーバの仕様ですが、時間が
なくなってしまったので、次回に回します。