Differences From Artifact [80b16f2bd31d3d7f]:
- File
index.dd
- 2010-11-26 05:03:10 - part of checkin [207cea338a] on branch trunk - changed hiding mechanizem of x in let x = ... for @macro layer. Old: set(x,ValueLayer,undefined) Nee: set(x,NoopLayer,null) (user: kinaba) [annotate]
To Artifact [a7325259b4f09952]:
- File
index.dd
- 2010-11-26 07:42:38 - part of checkin [f7e9e77316] on branch trunk - introduced "..." expression, and replaced the pattern match failure with this. (user: kinaba) [annotate]
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>