Diff
Not logged in

Differences From Artifact [80b16f2bd31d3d7f]:

To Artifact [a7325259b4f09952]:


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