Diff
Not logged in

Differences From Artifact [80b16f2bd31d3d7f]:

To Artifact [a7325259b4f09952]:


40 $(SECTION BNF, $(SECBODY 40 $(SECTION BNF, $(SECBODY 41 <pre> 41 <pre> 42 ID ::= 適当に識別子っぽい文字列 42 ID ::= 適当に識別子っぽい文字列 43 LAYER ::= "@" ID 43 LAYER ::= "@" ID 44 44 45 E ::= 45 E ::= 46 $(D_COMMENT # 変数宣言) 46 $(D_COMMENT # 変数宣言) 47 | ("var"|"let"|"def"|LAYER) ID "=" E (";"|"in") E | 47 | DECL "=" E (";"|"in") E 48 | ("var"|"let"|"def"|LAYER) ID "(" PARAMS ")" "{" E "}" (";"|"in") E | 48 | DECL "(" PARAMS ")" "{" E "}" (";"|"in") E 49 | ("var"|"let"|"def"|LAYER) ID "=" E | 49 | DECL "=" E 50 | ("var"|"let"|"def"|LAYER) ID "(" PARAMS ")" "{" E "}" | 50 | DECL "(" PARAMS ")" "{" E "}" > 51 > 52 where DECL ::= ("var"|"let"|"def"|LAYER) ID | "@" LAYER 51 53 52 $(D_COMMENT # リテラル) 54 $(D_COMMENT # リテラル) 53 | INTEGER $(D_COMMENT # 非負整数) 55 | INTEGER $(D_COMMENT # 非負整数) 54 | STRING $(D_COMMENT # "" でくくった文字列。\" と \\ は使える) 56 | STRING $(D_COMMENT # "" でくくった文字列。\" と \\ は使える) 55 | "{" ENTRYS "}" $(D_COMMENT # テーブル) 57 | "{" ENTRYS "}" $(D_COMMENT # テーブル) 56 | "fun" "(" PARAMS ")" "{" E "}" $(D_COMMENT # 無名関数) 58 | "fun" "(" PARAMS ")" "{" E "}" $(D_COMMENT # 無名関数) 57 | "λ" "(" PARAMS ")" "{" E "}" $(D_COMMENT # 無名関数) 59 | "λ" "(" PARAMS ")" "{" E "}" $(D_COMMENT # 無名関数) ................................................................................................................................................................................ 61 63 62 where ARGS ::= E "," ... "," E 64 where ARGS ::= E "," ... "," E 63 PARAMS ::= (ID|LAYER)+ "," ... "," (ID|LAYER)+ 65 PARAMS ::= (ID|LAYER)+ "," ... "," (ID|LAYER)+ 64 ENTRYS ::= ID ":" E "," ... "," ID ":" E 66 ENTRYS ::= ID ":" E "," ... "," ID ":" E 65 67 66 $(D_COMMENT # 演算子など) 68 $(D_COMMENT # 演算子など) 67 | "(" E ")" $(D_COMMENT # ただの括弧) 69 | "(" E ")" $(D_COMMENT # ただの括弧) > 70 | "..." $(D_COMMENT # これを実行するとdie) 68 | E BINOP E $(D_COMMENT # 二項演算子いろいろ) 71 | E BINOP E $(D_COMMENT # 二項演算子いろいろ) 69 | E "." ID $(D_COMMENT # テーブルのフィールドアクセス) 72 | E "." ID $(D_COMMENT # テーブルのフィールドアクセス) 70 | E ".?" ID $(D_COMMENT # テーブルにフィールドがあるか否か) 73 | E ".?" ID $(D_COMMENT # テーブルにフィールドがあるか否か) 71 | E "{" ENTRYS "}" $(D_COMMENT # テーブル拡張) 74 | E "{" ENTRYS "}" $(D_COMMENT # テーブル拡張) 72 | "if" E ("then"|":"|"then" ":") E 75 | "if" E ("then"|":"|"then" ":") E 73 | "if" E ("then"|":"|"then" ":") E "else" ":"? E 76 | "if" E ("then"|":"|"then" ":") E "else" ":"? E 74 77 ................................................................................................................................................................................ 200 以下のデータ型があります。 203 以下のデータ型があります。 201 </p> 204 </p> 202 <ul> 205 <ul> 203 <li>整数: <tt>0</tt>, <tt>123</tt>, <tt>456666666666666666666666666666666666 206 <li>整数: <tt>0</tt>, <tt>123</tt>, <tt>456666666666666666666666666666666666 204 <li>文字列: <tt>"hello, world!"</tt>, ...</li> 207 <li>文字列: <tt>"hello, world!"</tt>, ...</li> 205 <li>関数: <tt>fun(x){x+1}</tt></li> 208 <li>関数: <tt>fun(x){x+1}</tt></li> 206 <li>テーブル: <tt>{car: 1, cdr: {car: 2, cdr: {}}}</tt></li> 209 <li>テーブル: <tt>{car: 1, cdr: {car: 2, cdr: {}}}</tt></li> 207 <li>未定義値: (undefined。特殊なケースで作られます)</li> | 210 <li>未定義値: (特殊なケースで作られます。「レイヤ」の説明参照のこと。)</li> 208 </ul> 211 </ul> 209 <p> 212 <p> 210 関数はいわゆる「クロージャ」です。静的スコープで外側の環境にアクセスできます。 213 関数はいわゆる「クロージャ」です。静的スコープで外側の環境にアクセスできます。 211 テーブルはいわゆるプロトタイプチェーンを持っていて、 214 テーブルはいわゆるプロトタイプチェーンを持っていて、 212 自分にないフィールドの場合は親に問い合わせが行く感じになっていますが、 215 自分にないフィールドの場合は親に問い合わせが行く感じになっていますが、 213 フィールドの書き換えがないので、これは特に意味ないかもしれない…。 216 フィールドの書き換えがないので、これは特に意味ないかもしれない…。 214 </p> 217 </p> ................................................................................................................................................................................ 232 when {car:x, cdr:{}}: lst 235 when {car:x, cdr:{}}: lst 233 when {}: {} 236 when {}: {} 234 } 237 } 235 </pre> 238 </pre> 236 <p> 239 <p> 237 動かすときには、処理系がそれっぽい if-then-else に展開しています。 240 動かすときには、処理系がそれっぽい if-then-else に展開しています。 238 <tt>when</tt> を上から試していって、最初にマッチしたところを実行します。 241 <tt>when</tt> を上から試していって、最初にマッチしたところを実行します。 > 242 どれにもマッチしないとエラーでプログラム終了します。 239 </p> 243 </p> 240 <pre> 244 <pre> 241 PAT ::= "_" $(D_COMMENT # ワイルドカード) 245 PAT ::= "_" $(D_COMMENT # ワイルドカード) 242 | ID $(D_COMMENT # 変数パターン) 246 | ID $(D_COMMENT # 変数パターン) 243 | "{" ID ":" PAT "," ... "," ID : PAT "}" $(D_COMMENT # テーブルパターン) 247 | "{" ID ":" PAT "," ... "," ID : PAT "}" $(D_COMMENT # テーブルパターン) 244 | E $(D_COMMENT # 値パターン) 248 | E $(D_COMMENT # 値パターン) 245 </pre> 249 </pre>