プログラミング言語Koumeプログラミング言語KoumeEnglishはじめにKoumeはJSONで記述するプログラミング言語です。Koumeは以下の特徴を持ちます。導入ブラウザからscriptタグを使用して読み込むことができます。グローバル変数Koumeにパッケージが登録されます。src="koume.js"></script>Node.jsインストールは以下のようにします。コマンドラインからの実行をしたいときには-gオプションをつけてインストールします。koumeNode.jsで読み込ませるには以下のようにします。require('koume');使用方法コマンドラインからコマンドラインから使用するには以下のようにします。program.json評価した結果を表示しないときに-nオプションを使用します。JavaScriptからKoumeのプログラムのJSONを実行させるには以下のようにします。ここで、パッケージは変数Koumeにあるものとします。]);構文リファレンスリテラルJSONの数値、真偽値、nullはリテラルとなります。文字列はリテラルにはなりません。クオートが必要になります。変数参照JSONの文字列は変数への参照になります。]配列の先頭に関数名、その後に引数を指定することで関数を呼び出せます。配列にインデックスを適用することで、そのインデックスの要素を取得できます。オブジェクトにプロパティ名を適用することで、そのプロパティを取得することができます。文字列にインデックスを適用することで、そのインデックスの文字(1文字の文字列)を取得することができます。}}オブジェクトを"q"で囲うことによりクオートします。}}オブジェクト名とオブジェクトの値の組を与えることでオブジェクトを組み立てられます。オブジェクトの値は評価されます。オブジェクトの値にはJSONオブジェクトのみを与えることができます。}}consとほぼ同じですが、オブジェクトの値にはJSONオブジェクト以外も与えることができます。]}構文をブロック化します。最後の値が返されます。}}関数を作成します。argsに引数を、restに残余引数を設定します。restの変数に変数番号を適用することでrestの値を参照できます。condの値がfalseでないときはthenを、falseのときはelseを実行します。elseは省略可能です。]}多数の条件分岐です。上からcaseの条件を実行して、falseでなければthenを実行します。condにtrueを指定することでelseを指定できます。}}変数を定義します。オブジェクトのキーの変数名にオブジェクトの値を束縛します。}}変数へ値をセットします。オブジェクトのキーの変数名にオブジェクトの値をセットします。変数はすでに値が束縛されている必要があります。}}ローカル変数に値を束縛します。varsのオブジェクトのキーへオブジェクトの値が束縛されます。}}letにname属性をつけることでbeginの内容を関数にできます。これにより、再帰によるループを実現できます。}}letと同じですが、varsで定義できる関数内でvarsの値を参照できます。}}クオートと同じですが、"uq"のみをキーとして持つオブジェクトが現れたときは"uq"の値を評価します。}}qqとほぼ同じですが、タプルを生成します。}}オブジェクトがパターンにマッチするかを判定します。オブジェクトの値に現れる文字列は同名の変数に束縛され、beginに渡されます。}文字列内の${変数名}を変数の文字列表現に置き換えます。文字列の前後が空白のときは"$変数名"でも表現できます。$x.propsの形でオブジェクト内のプロパティ名を指定できます。"y"]}delayの属性で与えられたコードを遅延して実行します。遅延したコードはforceで取り出します。取り出された結果はメモ化されます。以下のコードは765を結果として返します。}]マクロのパターンにマッチした構文に対してbeginで評価された値で置き換えます。置き換えられた後再度マクロの評価がされます。それにより再帰的なマクロも記述できます。マクロの呼び出しは通常の構文と同様にマクロ名をオブジェクトのキーにして呼び出します。}andに与えられた配列が全てfalseでないときは最も右の値が戻ります。1つでもfalseがあったときはfalseになります。配列が空のときはtrueとなります。}orに与えられた配列に1つでもfalseでない値があったときはその値が戻ります。全てfalseのときはfalseになります。配列が空のときはfalseになります。}}文字列を与えてその結果がオブジェクトのキーに対応する値を返す関数を定義します。メッセージが見当たらないときは、extendsの関数にそのメッセージを渡します。extendsがfalseのときはエラーを返します。messageを利用して簡易的なオブジェクト指向を実現することができます。]引数で与えられた値を全て足す、または掛けます。]第1引数から第2引数以降を引く、または割ります。第1引数のみが与えられた時は符号反転、または逆数を得ます。]quotientは整数で除算した商を返します。remainderとmoduloは整数で除算した余りを返します。remainderとmoduloの違いは以下の通りです。]eqvは値が等しいかを判定しますが、構造までは判定しません。equalは値を構造まで含めて判定します。単調減少であるかを判定します。単調減少であるかを判定します。単調減少であるかを判定します。大文字小文字を区別しません。]三角関数を返します。]逆三角関数を返します。]指数・対数関数を返します。値域の外のときはNaNを返します。]引数の中で最も大きい、または小さい値を取得します。null、配列、オブジェクト、関数であるときにtrueを返します。配列もオブジェクトになります。]引数を要素とする配列を生成します。]配列の先頭の要素、2番目以降の配列を取得します。]プロパティの値を設定します。]引数で与えらえた配列を連結します。]第2引数以降で与えられた配列を第1引数で与えられた関数に適用して、その値を要素とする配列を作成します。]引数で与えられた文字列を連結します。]第1引数で与えられた文字列の第2引数から(第3引数-1)番目までの文字列を取得します。}]現在の継続を取り出して、第1引数で与えられた関数の引数に渡します。継続を使用することで、大域脱出や状態の復元を実現できます。状態の復元の例を以下に示します。結果は765となります。]第1引数で与えられた関数へ第2引数で与えられた配列の要素を引数として適用します。]delayされたコード(promise)を実行します。結果はメモ化されます。]第2引数で与えられたオブジェクトを第1引数で与えられた関数に適用して、その値を要素とする配列を作成します。]第1引数で与えらえた数値を第2引数で与えられた基数で文字列に変換します。基数は2〜36である必要があります。基数が省略されたときは10とします。]第1引数で与えらえた文字列を第2引数で与えられた基数で整数に変換します。基数は2〜36である必要があります。基数が省略されたときは10とします。]第1引数で与えらえた文字列を数値に変換します。]オブジェクトからオブジェクトのキーを要素に持つ配列を取得します。]配列または文字列の長さを取得します。配列にはJSONで表現可能な値しか要素になれませんでしたが、多値はJSONで表現不可能な値も要素になれます。]コンソールに文字を出力します。]文字列表現を取得します。JSONで表現可能な値のときはJSONでシリアライズされた値が取得できます。]エラーを出力し、処理を終了させます。]シンボルを生成します。マクロ内で衝突しない変数名を生成するのに使用します。