MikoScript 言語仕様

 構文構成

●プログラム
 「プログラム」は、テキストファイルに記述します。プログラムが記述されたテキスト
ファイルを「ソースファイル」と言います。ソースファイル内のプログラムを、「ソース
プログラム」と言います。ソースプログラムを解釈して実行するのが、「インタプリタ」
です。

 ソースプログラムは、「構文」で構成されます。構文には、「実行文」と「関数定義」
があります。関数定義内にも、実行文がありますが、それは、その関数がコールされない
限り、実行されません。インタプリタが、ソースプログラムを実行する際に、直接の実行
対象になるのは、関数定義の外にある実行文です。

 例えば、以下のソースプログラムには、直接の実行対象になる関数定義外の実行文と、
直接の実行対象にはならない関数定義が、それぞれ1つずつあります。
    print "これは関数定義外の実行文です";

    function F()    // 関数定義
    {
        print "これは関数定義内の実行文です";
    }
このプログラムを実行すると、「これは関数定義外の実行文です」がプリントされますが、
関数定義は実行されないので、「これは関数定義内の実行文です」はプリントされません。

 一方、次のソースプログラムでは、直接の実行対象になる関数定義外の実行文で、定義
関数をコールしてしています。
    F();    // 関数コール
    print "これは関数定義外の実行文です";

    function F()    // 関数定義
    {
        print "これは関数定義内の実行文です";
    }
この場合、関数コールよって関数が実行されるので、「これは関数定義内の実行文です」
と「これは関数定義外の実行文です」の両方がプリントされます。
 なお、この例でも分かるように、本言語では、関数コールよりも後の行で、関数定義が
記述されていても、特に問題ありません。

 このように、本言語のソースプログラムには、C 言語ような main 関数はありません。
その代わりに、ソースプログラム全体が、言わば「暗黙のメイン関数」になっています。
インタプリタは、ソースプログラムを実行する際、この暗黙のメイン関数を最初にコール
します。但し、ソースプログラムに「初期設定関数」が定義されていれば、それを先に
実行します。この詳細は「モジュール」の章で説明しています。

 ソースプログラムが、関数定義だけで直接の実行文がない場合、インタプリタでそれを
実行しても、そのプログラムのどの部分も、実質的な実行対象にはなりません。例えば、
    function F1()   {  print "This is F1.";  }
    function F2()   {  print "This is F2.";  }
のようなソースプログラムを、インタプリタで実行しても、翻訳は行なわれますが、実質
的には、プログラムのどの部分も実行されません。関数定義だけのソースプログラムは、
通常、ライブラリー用のプログラムになります。
 但し、暗黙のメイン関数内の直接の実行文は、共通のサブルーチンとして、「call 文」
から呼び出せるので、ライブラリー用のソースプログラムに、直接の実行文がある場合も
あります。このサブルーチンコールについては、「制御の流れ(ジャンプ系)」の章内の
「call 文と back 文」の節で述べます。

●実行文
「実行文」は、単に「文」とも言います。
本言語の「実行文」には、以下の種類があります。

種別名        書式          
 式文  式*;
 ブロック文  { 文の並び }
 if 文  if( 式 ) 文 else 文
 switch 文  switch( 式 ) 文
 while 文  while( 式 ) 文
 for 文  for( 式* ; 式* ; 式* ) 文
 do-while 文  do 文 while( 式 );
 continue 文  continue;
 break 文  break;
 quit 文  quit;
 goto 文  goto ラベル;
 warp 文  warp ラベル;
 call 文  call ラベル;
 back 文  back;
 return 文  return 式;
 scope 文  scope 箱名 { 文の並び }
 構造体設定文  構造体名 ::= { 文の並び }
 class 文  class クラス名 : 基底 { クラス記述 }
 delete 文  delete 箱名の並び;
 print 文  print 項目の並び;
 コマンド文  関数名~ 引数の並び;
 配列初期設定文   配列 = { 初期値の並び };
 空文  ;
(注意)表内の書式はあくまで参考で、関係各所で厳密に記します。     式* は、「リスト式」にもできます。(詳細後述) 実行文には、「ラベル」を付けることができます。 実行文は、「式」ではないので、実行文の値というものはありません。 上記の各実行文のうち、「ブロック文」については、以下で説明します。 それ以外は、関係各所で詳述しています。 ●ブロック文  「ブロック文」は、一連の実行文を、波括弧 { と } で囲ったもので、実行文のまとま りを表わします。そのため、ブロック文を、「複文」と言うこともあります。ブロック文 自身もまた、実行文なので、ブロック文の波括弧の囲いの中に、別のブロック文を入れる ことができます。つまり、ブロック文は入れ子にすることができます。また、特殊なケー スとして、実行文を全く含まない空の波括弧の囲いも、ブロック文になります。多くの実 行文の末尾は、セミコロン ; になりますが、ブロック文の末尾には、セミコロン ; が付 きません。 ●式  「式」には、単一の字句要素から成る「単項式」と、複数の字句要素から成る「複合式」 があります。  式には「値」があります。式の値を求めることを「式を評価する」と言います。  「単項式」には、以下の種類があります。これらの表記に関しては、「字句要素」の章 で詳述しています。また、意味は、「基本データ型」の章等の関連各所で詳述しています。   ・整数定数 ・浮動小数点定数 ・文字定数 ・定文字列 ・null ・this ・箱名(識別名)  「複合式」には、いろいろありますが、機能的に分類すると、以下のようになります。 これらは、関連各所で詳述しています。 ・箱の経路(連想配列要素も含む) ・演算式(算術/論理演算等) ・関数コール ・インスタンス生成 ・純粋配列要素 ・匿名関数定義 ・その他 ●リスト式  「文」のなかで使われる「式」には、複数の式をコンマで区切った「リスト式」にでき る場合もあります。上記の実行文の種類の表内の「式*」がその場合です。  リスト式は、たとえば、以下のような書き方になります。
    A = 1,  X++,  B = 2 * F( i, j )
 リスト式の評価は、必ず、左から右の順に行なわれます。たとえば、
    式1, 式2, 式3
の場合、まず、式1が評価され、次に、式2が評価され、最後に、式3が評価されます。
リスト式全体の評価値としては、最後の式の評価値で代表されます。たとえば、上例の
リスト式の評価値は、式3の評価値になります。

 リスト式を「多重代入」「return 文」で使う場合、丸括弧で囲う必要があります。
 リスト式は、現状、この用途か、前述の「式*」の場合以外は、使えません。


●関数定義
 本言語の「関数定義」には、以下の2種類があります。
      ・通常の関数定義
      ・演算子の多重定義

 関数定義内の実行文は、前述の通り、その関数がコールされた時に、実行されます。
 関数定義自体は、実行文とは違って、ラベルを付けることはできません。
 関数定義は、式ではないので、関数定義の値というものはありませんが、関数コールに
よって、その関数が返す値を取得することができます。
 関数定義は、入れ子にすることはできません。つまり、関数定義の中で、別の関数定義
を入れることはできません。但し、「匿名関数」「do-with 式」内の「ブロック関数」
の定義を入れることはできます。

 通常の関数定義は「関数」の章で、演算子の多重定義は「演算子の多重定義」の章で、
それぞれ、詳説しています。