肝の仕様について
※注意
これは、ウミヘビの本体開発者向けの文書です。クリエイター向けのウミヘビの説明についてはこちらをご覧ください。
プロジェクトの保存について
プロジェクトはある種のフォルダ(以降プロジェクトフォルダと呼ぶ)、またはそれに変換できる形式のファイル(.zipなどの圧縮ファイルなど)として保存される。
また、プロジェクトフォルダの中には次のものが存在する:
- 「assets」という名前のフォルダ
- 「data」という名前のjsonファイル(data.json) (以下は0.8.1で追加)
- 「favicon」という名前のicoファイル(favicon.ico)
assetsフォルダ
この中にはプロジェクトで使うファイルを保存する。
この中に含まれるすべてのファイルは次のいずれかの名前のフォルダの直下にあり、また、そのフォルダ名に紐づいた役割を持つ:
- 「images」: 画像ファイルを格納する。
- 「sounds」: 音声ファイルを格納する。
- 「movies」: 動画ファイルを格納する。
- 「datas」: データファイルを格納する。
例えば、「assets/images/test.png」や「assets/ABC/images/xyz.jpg」は、「images」フォルダ直下にあるため画像ファイルとして認識されるが、 「assets/images/movies/test.gif」は「images」フォルダ直下ではなく、「movies」フォルダ直下にあるため動画ファイルとして認識される。
favicon.ico
このプロジェクトのアイコンのicoファイルであり、任意である。
存在しない場合はデフォルトのものが代わりに使われる。
data.json
この中にはプロジェクトのバージョンなどのデータやプログラムを保存する。
このファイルはオブジェクトを表現し、次のプロパティを持つ:
-
「system」: システムにかかわるデータを保存するオブジェクトであり、次のプロパティを持つ:
- 「version」: このプロジェクトの形式のバージョンを示すバージョン文字列。
- 「programs」: プログラムを保存するリストであり、その要素は宣言ノードである。
宣言ノード
宣言ノードは次のいずれかである(今後追加する予定):
- 静的イベント購読ノード (以降は0.3.0で追加)
- 変数定義ノード
- 定数定義ノード
- 関数定義ノード (以降は0.8.0で追加)
- 特殊関数定義ノード
静的イベント購読ノード
静的イベント購読ノードは静的なイベント購読を表すノードであり、次のプロパティを持つオブジェクトである:
- 「type」: 文字列「dec_observe」である。
- 「event」: 購読するイベントを表す式ノード。0.6.0で変更される以前はIDそのものだった。
- 「body」: イベントを受け取った際に実行する、スコープブロックノードである。 (以降は0.3.0で追加)
- 「params」(かつては「args」だったが、0.7.0で改名。): 購読するイベントの仮引数を表す、仮引数ノードのリスト。必須。
なお、かつては、スコープブロックの中で静的なイベント購読をした場合は、スコープブロック終了時に購読したイベントを解除していたが、0.7.0からは、スコープブロックの中では利用できなくなった。
変数定義ノード
変数定義ノードは変数の定義を表すノードであり、次のプロパティを持つオブジェクトである:
- 「type」: 文字列「dec_var」である。
- 「name」: 変数の名前。
- 「id」: 変数のID。任意。ただし、スコープブロック外でのみ。
- 「var_type」: 変数に格納することのできる値の型を表す型ノードである。 (以降は0.5.1で追加)
- 「value」: 変数の初期値を表す式ノードである。省略可能。
なお、スコープブロック内で用いられた場合はローカル変数、そうでない場合はグローバル変数を定義する。
また、IDが存在するものは外からの参照が可能になる。
定数定義ノード
定数定義ノードは定数の定義を表すノードであり、次のプロパティを持つオブジェクトである:
- 「type」: 文字列「dec_const」である。
- 「name」: 定数の名前。
- 「id」: 定数のID。任意。ただし、スコープブロック外でのみ。
- 「value」: 定数の値を表す式ノードである。
- 「value_type」: 定数の型を表す型ノードである。
なお、スコープブロック内で用いられた場合はローカル定数、そうでない場合はグローバル定数を定義する。
そして、グローバル定数の値及びグローバル変数の初期値の計算は定数、変数の順番にプログラムの開始の前に上から順番に、ローカル定数の値及びローカル変数の初期値の値の計算はその文が実行される際に行われる。
計算される前に参照するとエラーになるので気を付けること。
また、変数定義ノードと同様に、IDが存在するものは外からの参照が可能になる。
関数定義ノード
関数定義ノードは関数の定義を表すノードであり、次のプロパティを持つオブジェクトである:
- 「type」: 文字列「dec_func」である。
- 「name」: 関数の名前。
- 「id」: 関数のID。任意。ただし、スコープブロック外でのみ。
- 「params」(かつては「args」だったが、0.7.0で改名。): 関数の仮引数を表す、仮引数ノードのリスト。
- 「body」: 関数が実行された際に実行する、スコープブロックノードである。
- 「return_type」: 戻り値の型を表す型ノードである。
なお、スコープブロック内で用いられた場合はローカル関数、そうでない場合はグローバル関数を定義する。
そして、ローカル関数は定義されたスコープブロックの変数等の参照が可能である。
また、変数定義ノードと同様に、IDが存在するものは外からの参照が可能になる。
特殊関数定義ノード
特殊関数定義ノードは特殊関数の定義を表すノードであり、次のプロパティを持つオブジェクトである:
- 「type」: 文字列「dec_special_func」である。
- 「name」: その特殊関数の種類を表す文字列であり、コンストラクタを表す「ctor」、デストラクタを表す「dtor」、エントリポイントを表す「entry」のいづれか。
- 「params」: 関数の仮引数を表す、仮引数ノードのリスト。エントリポイントであるときしか存在してはならない。
- 「body」: 関数が実行された際に実行する、スコープブロックノードである。
なお、スコープブロック内で用いられた場合はローカル関数、そうでない場合はグローバル関数を定義する。
そして、ローカル関数は定義されたスコープブロックの変数等の参照が可能である。
仮引数ノード
仮引数ノードは仮引数を表すノードであり、次のプロパティを持つオブジェクトである:
- 「name」: 仮引数の名前。0.6.0で変更される以前は「id」という名前だった。
- 「type」: 引数の型を表す型ノードである。
なお、仮引数は、関数内では定数として扱われる。 (0.4.0で変更: 以前は変数として扱われていた。)
型ノード
型ノードは型を表すノードであり、次のいずれかである(今後追加する予定):
参照型ノード
参照型ノードは参照の型を表すノードであり、次のプロパティを持つオブジェクトである:
- 「type」: 文字列「typ_ref」である。
- 「of」: 参照先の値の型を表す型ノード。(0.5.0で追加: 任意である。)
関数型ノード
関数型ノードは関数の型を表すノードであり、次のプロパティを持つオブジェクトである:
- 「type」: 文字列「typ_func」である。
- 「params」(かつては「args」だったが、0.7.0で改名。): 引数の型を表す型ノードのリスト。
- 「return」: 戻り値の型を表す型ノード。
スコープブロックノード
スコープブロックノードはスコープブロックを表すノードであり、文ノードを要素として持つリストである。
文ノード
文ノードは文を表すノードであり、次のいずれかである(今後追加する予定):
終わるノード
終わるノードは関数から値を返して終わることや、イベント購読内でイベント時の処理を終わることなどを表すノードであり、次のプロパティを持つオブジェクトである:
- 「type」: 文字列「stm_return」である。
- 「value」 : 返す値を表す式ノード。関数内でのみ用いることが可能であり、任意で、関数内でこのノードが用いられ、なおかつ「value」プロパティがない場合は「なし」が返される。
なお、関数やイベント購読の外で使った場合はエラーになる。
「もし」ノード
「もし」ノードは条件分岐を表すノードであり、次のプロパティを持つオブジェクトである:
- 「type」: 文字列「stm_if」である。
- 「condition」 : 条件を表す式ノード。値は真偽値に変換される。
- 「body」 : 条件が「はい」の時に実行するスコープブロックノード。
- 「else」 : 条件が「いいえ」の時に実行するスコープブロックノード。任意であり、ない場合は「いいえ」の時は何もしない。
「~の間」ノード
「~の間」ノードは繰り返しを表すノードであり、次のプロパティを持つオブジェクトである:
- 「type」: 文字列「stm_while」である。
- 「condition」 : 条件を表す式ノード。値は真偽値に変換される。
- 「body」 : 条件が「はい」の間、ずっと実行するスコープブロックノード。
- 「else」 : 条件が「いいえ」になり、ループが終わった時に実行するスコープブロックノード。任意であり、ない場合は何もしない。
なお、最初から条件が「いいえ」の時は、もしあれば、「else」を実行しておわる。
式ノード
式ノードは式を表すノードであり、次のいずれかである(今後追加する予定):
- 通常リテラルノード
- 関数呼び出しノード
- ID参照ノード (以降は0.3.0で追加)
- 名前参照ノード
- ローカル変数定義式ノード
- 代入式ノード
- 間接参照式ノード (以降は0.4.0で追加)
- キャスト式ノード (以降は0.5.2で追加)
- 内部参照ノード (以降は0.8.3で追加)
- 関数式ノード (以降は0.9.0で追加)
- 構築式ノード
- 型判別式ノード
通常リテラルノード
通常リテラルノードは数値リテラルや文字列リテラルなどの通常のリテラルを表すノードであり、次のプロパティを持つオブジェクトである:
- 「type」: 文字列「exp_literal」である。
- 「value」 : リテラルの値
-
「value_type」 : リテラルの値の型を意味する文字列で、文字列を意味する「string」、整数を意味する「int」、小数を意味する「float」、組み込み定数(「はい」、「いいえ」、「なし」のいずれか)を意味する「const」のいずれか。
※組み込み定数は0.3.1で追加
関数呼び出しノード
関数呼び出しノードは関数の呼び出しを表すノードであり、次のプロパティを持つオブジェクトである:
- 「type」: 文字列「exp_funcall」である。
- 「callee」: 呼び出す関数の式を表す式ノード。
- 「args」: 関数の引数となる値の式の式ノードのリスト。
ID参照ノード
ID参照ノードはIDを基にした関数などの参照を表すノードであり、次のプロパティを持つオブジェクトである:
- 「type」: 文字列「exp_ref_id」である。
- 「id」: ID。
※変数を参照した場合は、変数の参照が返され、定数を参照した場合は、その定数の値が返されるので、注意すること。
名前参照ノード
名前参照ノードは名前を基にした関数などの参照を表すノードであり、次のプロパティを持つオブジェクトである:
- 「type」: 文字列「exp_ref_name」である。
- 「name」: 名前。
※ID参照ノードと同様に、変数を参照した場合は、変数の参照が返され、定数を参照した場合は、その定数の値が返されるので、注意すること。
内部参照ノード
内部参照ノードは名前空間の内部の関数などの参照を表すノードであり、次のプロパティを持つオブジェクトである:
- 「type」: 文字列「exp_ref_member」である。
- 「of」: 名前空間を表す式ノード。
- 「id」: 名前空間内でのID。
※ID参照ノードと同様に、変数を参照した場合は、変数の参照が返され、定数を参照した場合は、その定数の値が返されるので、注意すること。
ローカル変数定義式ノード
ローカル変数定義式ノードはローカル変数の定義を表すノードであり、次のプロパティを持つオブジェクトである:
- 「type」: 文字列「exp_def_var」である。
- 「name」: 変数の名前。
- 「var_type」: 変数に格納することのできる値の型を表す型ノードである。 (以降は0.5.1で追加)
- 「value」: 変数の初期値を表す式ノードである。省略可能。
また、この式の値は新しくできた変数の参照となる。
代入式ノード
代入式ノードは参照への代入を表すノードであり、次のプロパティを持つオブジェクトである:
- 「type」: 文字列「exp_assign」である。
- 「ref」: 代入される参照の式を表す式ノード。
- 「value」: 代入する値の式を表す式ノード。
また、この式の値は代入された値となる。
間接参照式ノード
間接参照式ノードは参照の間接参照を表すノードであり、次のプロパティを持つオブジェクトである:
- 「type」: 文字列「exp_deref」である。
- 「ref」: 間接参照される参照の式を表す式ノード。
また、この式の値は間接参照された参照の値となる。
キャスト式ノード
キャスト式ノードは値のキャストを表すノードであり、次のプロパティを持つオブジェクトである:
- 「type」: 文字列「exp_cast」である。
- 「value」: キャストする値を表す式ノード。
- 「value_type」: キャスト先の型を表す型ノードである。
また、この式の値はキャストされた値となる。
関数式ノード
関数式ノードは関数式を表すノードであり、次のプロパティを持つオブジェクトである:
- 「type」: 文字列「exp_lambda」である。
- 「params」: 関数の仮引数を表す、仮引数ノードのリスト。
- 「return_type」: 戻り値の型を表す型ノードである。
また、次のいずれか一方のみを持つ:
- 「body」: 関数が実行された際に実行する、スコープブロックノードである。
- 「value」: 関数が実行された際に計算する式ノードであり、これの値がこの関数の戻り値となる。
また、この式の値は関数となる。
構築式ノード
構築式ノードはクラスの実体の構築を表すノードであり、次のプロパティを持つオブジェクトである:
- 「type」: 文字列「exp_new」である。
- 「value_type」: 実体を構築するクラスの型ノード。
- 「args」: 構築子の引数となる値の式の式ノードのリスト。
また、この式の値は新しく作られたクラスの実体となる。
型判別式ノード
型判別式ノードは値の型の判別を表すノードであり、次のプロパティを持つオブジェクトである:
- 「type」: 文字列「exp_type_check」である。
- 「check_type」: 判別する型を表現する型ノード。
- 「value」: 型を判別する値の式の式ノード。
また、この式の値は値がその型だったら「はい」、そうでなかったら「いいえ」となる。
バージョン文字列
バージョン文字列は、三つの非負整数(順に、メジャーバージョン、マイナーバージョン、パッチバージョンと呼ぶ)をドットでつなげたものに、次のバージョン接尾辞がついたものである:
-
開発中接尾辞: 「a」、「b」、「rc」の後に非負整数が続くものは開発中接尾辞とよばれ、バージョン接尾辞の一種である。また、初めのローマ字列によって、それぞれアルファ接尾辞、ベータ接尾辞、リリース接尾辞と呼ばれる。
例えば、「1.0.0a0」、「1.0.1b3」、「1.0.5rc9」というバージョン文字列は、すべて開発中接尾辞をもっており、それぞれ、アルファ接尾辞「a0」、ベータ接尾辞「b3」、リリース接尾辞「rc9」を持っている。
また、バージョンアップの際、
破壊的な変更がある場合はメジャーバージョンを一増やしてマイナーバージョンやパッチバージョンを0に戻し、
機能の追加がある場合はマイナーバージョンを一増やしてパッチバージョンを0に戻し、
単なるバグ修正の場合はパッチバージョンを一増やす。
例えば、バージョン「1.2.3」であるライブラリがあるとき、
これのバグを修正したバージョンはバージョン「1.2.4」、
これに新たな機能を追加したバージョンはバージョン「1.3.0」、
これからいくつかの時代遅れな機能を取り除いたバージョンはバージョン「2.0.0」である。
しかし、元のバージョンのメジャーバージョンが0であるもの(未完成バージョン)は、メジャーバージョン、マイナーバージョン、パッチバージョンのいずれかを増やすが、マイナーバージョンを一増やした時は、パッチバージョンを0に戻し、メジャーバージョンを一増やしたときは、マイナーバージョンやパッチバージョンを0に戻さなくてはならない。
例えば、バージョン「0.1.2」であるライブラリに変更を加えたバージョンは、その変更の種類にかかわらず、バージョン「0.1.3」、「0.2.0」、「1.0.0」のいずれかにする。
また、バージョンは基本的にメジャーバージョンが大きい方が新しく、
それが同じ場合は、マイナーバージョンが大きい方が新しく、
それも同じ場合は、パッチバージョンが大きい方が新しく、
それまで同じ場合は、開発中接尾辞がない方が新しく、
あるものの中では、リリース接尾辞を持つもの、ベータ接尾辞を持つもの、アルファ接尾辞を持つものの順に新しく、
それも同じ場合は、開発中接尾辞に含まれる数字が大きいものの方が新しい。
例えば、「1.2.3a5」は、次のどのバージョンよりも古い:
- 2.0.0
- 1.3.0
- 1.2.4
- 1.2.3
- 1.2.3rc0
- 1.2.3a6
ID
ウミヘビにおけるIDとは、様々なものを区別するための文字列である。
IDは名前空間に属し、同じ名前空間に属すIDの中で一意である。
0.6.0で変更される以前は、代わりにUUIDの文字列表現(ローマ字はすべて大文字)を用いていた。
メタデータファイルについて
メタデータファイルとは、型の継承関係や関数の引数や戻り値の型などの情報を保存するjsonファイルのことで、あるオブジェクトを表現し、そのオブジェクトは次のプロパティを持つ:
-
「system」: システムにかかわるデータを保存するオブジェクトであり、次のプロパティを持つ:
- 「version」: この定義ファイルの形式のバージョンを示すバージョン文字列。
- 「translation」: 翻訳データであり、ある言語のロケールIDをキーとして、キーがIDで値が翻訳先の言語での表現であるオブジェクトを値とするオブジェクトである。 ただし、関数の表現については、引数の位置を$(引数の番号)で指定し、$を$_で表すものとする。
- 「definition」: IDをキーとし、そのIDを持つものの定義データを持つオブジェクト。
定義データ
定義データとはIDを持つプログラムの要素に対応し、次のプロパティを持つオブジェクトであり、対応するものによって異なる形式を取る。
関数
関数に対応する場合は次のプロパティを持つ:
- 「type」: 文字列「func」である。
- 「arg_types」: 引数の型を表す型ノードの配列である。
- 「return_type」: 戻り値の型を表す型ノードである。 (以降は0.8.3で追加)
- 「overloads」: オーバーロードを表すオブジェクトの配列。任意であり、ある場合は「arg_types」と「return_type」は無視される。
また、オーバーロードを表すオブジェクトは次のプロパティを持つ:- 「arg_types」: 引数の型を表す型ノードの配列である。
- 「return_type」: 戻り値の型を表す型ノードである。
変数
変数に対応する場合は次のプロパティを持つ:
- 「type」: 文字列「var」である。
- 「var_type」: 変数に格納することのできる値の型を表す型ノードである。
定数
定数に対応する場合は次のプロパティを持つ:
- 「type」: 文字列「const」である。
- 「value_type」: 定数の型を表す型ノードである。
イベント
イベントに対応する場合は次のプロパティを持つ:
- 「type」: 文字列「event」である。
- 「arg_types」: 引数の型を表す型ノードの配列である。
型
型に対応する場合は次のプロパティを持つ:
- 「type」: 文字列「type」である。
- 「implements」: 自らが実装しているクラスと自らが含まれる抽象型の型ノードの配列である。
- 「properties」: プロパティのIDをキーとし、その定義データを値とするオブジェクトである。
- 「ctor」: コンストラクタのオーバーロードを表すオブジェクトの配列。
名前空間
名前空間に対応する場合は次のプロパティを持つ:
- 「type」: 文字列「name_space」である。
- 「implements」: 自らが実装しているクラスと自らが含まれる抽象型の型ノードの配列である。
- 「properties」: プロパティのIDをキーとし、その定義データを値とするオブジェクトである。
実行環境について
こちらを参照してください。変更履歴
- 2023/09/26: 初めて公開しました。(0.2.0)
- 2023/10/30: 変数や関数、型などを追加しました。(0.3.0) 破壊的な変更があります。ご注意ください。
- 2023/11/20: 組み込み定数リテラルを追加し、解説を改善しました。(0.3.1)
-
2023/11/24:
いくつかの破壊的な変更を行いました。(0.4.0)
一覧はこちら: - 2023/12/02: キャスト式ノードの記述を修正し、脱落、誤字を直しました。
- 2023/12/03: すべて型を削除し、型無し参照を追加しました。(0.5.0)
- 2023/12/23: 変数定義ノード及びローカル変数定義式ノードに初期値を追加し、誤字を修正しました。(0.5.1)
- 2024/01/10: 誤字を修正し、表現を改善しました。
- 2024/01/31: 内部参照ノードを追加し、誤字を修正しました。(0.5.2)
- 2024/02/01: 誤字を修正し、表現を改善しました。
- 2024/02/20: 表現を改善し、仮引数ノードのプロパティの名前を変更し、UUIDをIDに変更し、そして、静的イベント購読ノードの「event」プロパティの種類を変更しました。(0.6.0)
- 2024/02/21: 型ノードに特殊な内部参照ノードを追加しました。(0.6.1)
- 2024/02/27: 関数定義ノードと静的イベント購読ノード、関数型ノードで「args」プロパティを「params」プロパティに改名し、静的イベント購読ノードをスコープブロック内で使用出来なくしました。(0.7.0)
- 2024/02/28: ミスを修正しました。
- 2024/03/16: 特殊関数定義ノードを追加しました。(0.8.0)
- 2024/04/10: favicon.icoを追加しました。(0.8.1)
- 2024/04/13: 誤字を修正し、メタデータファイルを追加し、定数と名前空間の定義データへの言及を追加しました。(0.8.2)
- 2024/04/18: 誤字を修正し、「overloads」プロパティと関数式を追加しました。(0.8.3)
- 2024/04/22: 誤字を修正し、リンク切れを修正しました。
- 2024/05/25: 構築式ノードと型判別式ノードを追加しました。(0.9.0)
- 2024/05/25: 型の定義データに必須のプロパティ「ctor」を追加しました。
作成 ski.com