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 $(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>