徒然なる日々を送るソフトウェアデベロッパーの記録(2)

技術上思ったことや感じたことを気ままに記録していくブログです。さくらから移設しました。

minosys script を作ろう (2)

新作 script に取り入れたい言語定義は以下の通りです。

分かりやすい制御構造

別に C がいいという訳ではないのですが、悲しいかな C 以上に
単純な制御構造+式構造が思いつかないので、C から
借りてくることにします。

ただし、do while とか後回しにします。

とりあえず必要な制御構造は以下かな。

  • if <評価式> <文1> { else <文2> }
  • for (<評価式1>; <評価式2>; <評価式3>) <文>
  • while <評価式> <文>
  • continue;
  • break { <ラベル> };
  • global <変数>{=<評価式>};

ラベルと評価式

ラベルと評価式は C の定義をほぼ踏襲します。
ただし、コンマ演算子は定義しません。

変数

変数は PHPperl と同じように先頭に $ をつけて表現することにします。

クラス定義

カッコ付けて 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 評価式を指定の型に変換する。
print デバッグ用に指定された値を標準出力に出力する。
exit プログラムを終了する。引数としてプログラム終了値を指定する。

言語仕様が決まったら次はサーバの仕様ですが、時間が
なくなってしまったので、次回に回します。