@@ -43,12 +43,14 @@ LAYER ::= "@" ID E ::= $(D_COMMENT # 変数宣言) - | ("var"|"let"|"def"|LAYER) ID "=" E (";"|"in") E - | ("var"|"let"|"def"|LAYER) ID "(" PARAMS ")" "{" E "}" (";"|"in") E - | ("var"|"let"|"def"|LAYER) ID "=" E - | ("var"|"let"|"def"|LAYER) ID "(" PARAMS ")" "{" E "}" + | DECL "=" E (";"|"in") E + | DECL "(" PARAMS ")" "{" E "}" (";"|"in") E + | DECL "=" E + | DECL "(" PARAMS ")" "{" E "}" + + where DECL ::= ("var"|"let"|"def"|LAYER) ID | "@" LAYER $(D_COMMENT # リテラル) | INTEGER $(D_COMMENT # 非負整数) | STRING $(D_COMMENT # "" でくくった文字列。\" と \\ は使える) @@ -64,8 +66,9 @@ ENTRYS ::= ID ":" E "," ... "," ID ":" E $(D_COMMENT # 演算子など) | "(" E ")" $(D_COMMENT # ただの括弧) + | "..." $(D_COMMENT # これを実行するとdie) | E BINOP E $(D_COMMENT # 二項演算子いろいろ) | E "." ID $(D_COMMENT # テーブルのフィールドアクセス) | E ".?" ID $(D_COMMENT # テーブルにフィールドがあるか否か) | E "{" ENTRYS "}" $(D_COMMENT # テーブル拡張) @@ -203,9 +206,9 @@
  • 整数: 0, 123, 456666666666666666666666666666666666666789, ...
  • 文字列: "hello, world!", ...
  • 関数: fun(x){x+1}
  • テーブル: {car: 1, cdr: {car: 2, cdr: {}}}
  • -
  • 未定義値: (undefined。特殊なケースで作られます)
  • +
  • 未定義値: (特殊なケースで作られます。「レイヤ」の説明参照のこと。)
  • 関数はいわゆる「クロージャ」です。静的スコープで外側の環境にアクセスできます。 テーブルはいわゆるプロトタイプチェーンを持っていて、 @@ -235,8 +238,9 @@

    動かすときには、処理系がそれっぽい if-then-else に展開しています。 when を上から試していって、最初にマッチしたところを実行します。 +どれにもマッチしないとエラーでプログラム終了します。

        PAT ::= "_"                                      $(D_COMMENT # ワイルドカード)
              | ID                                       $(D_COMMENT # 変数パターン)