Mercurial > urweb
comparison src/lacweb.grm @ 240:7036d29574f2
Shorthand for multi-binding con declaration
author | Adam Chlipala <adamc@hcoop.net> |
---|---|
date | Thu, 28 Aug 2008 13:39:20 -0400 |
parents | fc6f04889bf2 |
children | 052126db06e7 |
comparison
equal
deleted
inserted
replaced
239:fc6f04889bf2 | 240:7036d29574f2 |
---|---|
191 | str of str | 191 | str of str |
192 | 192 |
193 | kind of kind | 193 | kind of kind |
194 | ktuple of kind list | 194 | ktuple of kind list |
195 | kcolon of explicitness | 195 | kcolon of explicitness |
196 | kopt of kind option | |
196 | 197 |
197 | path of string list * string | 198 | path of string list * string |
198 | cpath of string list * string | 199 | cpath of string list * string |
199 | spath of str | 200 | spath of str |
200 | mpath of string list | 201 | mpath of string list |
209 | rcon of (con * con) list | 210 | rcon of (con * con) list |
210 | rconn of (con * con) list | 211 | rconn of (con * con) list |
211 | rcone of (con * con) list | 212 | rcone of (con * con) list |
212 | cargs of con * kind -> con * kind | 213 | cargs of con * kind -> con * kind |
213 | cargl of con * kind -> con * kind | 214 | cargl of con * kind -> con * kind |
215 | cargl2 of con * kind -> con * kind | |
214 | carg of con * kind -> con * kind | 216 | carg of con * kind -> con * kind |
215 | cargp of con * kind -> con * kind | 217 | cargp of con * kind -> con * kind |
216 | 218 |
217 | eexp of exp | 219 | eexp of exp |
218 | eapps of exp | 220 | eapps of exp |
293 s (SIGleft, sgisright))]) | 295 s (SIGleft, sgisright))]) |
294 | 296 |
295 decls : ([]) | 297 decls : ([]) |
296 | decl decls (decl :: decls) | 298 | decl decls (decl :: decls) |
297 | 299 |
298 decl : CON SYMBOL EQ cexp (DCon (SYMBOL, NONE, cexp), s (CONleft, cexpright)) | 300 decl : CON SYMBOL cargl2 kopt EQ cexp (let |
299 | CON SYMBOL DCOLON kind EQ cexp (DCon (SYMBOL, SOME kind, cexp), s (CONleft, cexpright)) | 301 val loc = s (CONleft, cexpright) |
302 | |
303 val k = Option.getOpt (kopt, (KWild, loc)) | |
304 val (c, k) = cargl2 (cexp, k) | |
305 in | |
306 (DCon (SYMBOL, SOME k, c), loc) | |
307 end) | |
300 | LTYPE SYMBOL EQ cexp (DCon (SYMBOL, SOME (KType, s (LTYPEleft, cexpright)), cexp), | 308 | LTYPE SYMBOL EQ cexp (DCon (SYMBOL, SOME (KType, s (LTYPEleft, cexpright)), cexp), |
301 s (LTYPEleft, cexpright)) | 309 s (LTYPEleft, cexpright)) |
302 | DATATYPE SYMBOL dargs EQ barOpt dcons(DDatatype (SYMBOL, dargs, dcons), s (DATATYPEleft, dconsright)) | 310 | DATATYPE SYMBOL dargs EQ barOpt dcons(DDatatype (SYMBOL, dargs, dcons), s (DATATYPEleft, dconsright)) |
303 | DATATYPE SYMBOL dargs EQ DATATYPE CSYMBOL DOT path | 311 | DATATYPE SYMBOL dargs EQ DATATYPE CSYMBOL DOT path |
304 (case dargs of | 312 (case dargs of |
335 val c = (CAbs (SYMBOL2, SOME k, cexp), loc) | 343 val c = (CAbs (SYMBOL2, SOME k, cexp), loc) |
336 in | 344 in |
337 (DClass (SYMBOL1, c), s (CLASSleft, cexpright)) | 345 (DClass (SYMBOL1, c), s (CLASSleft, cexpright)) |
338 end) | 346 end) |
339 | 347 |
348 kopt : (NONE) | |
349 | DCOLON kind (SOME kind) | |
350 | |
340 dargs : ([]) | 351 dargs : ([]) |
341 | SYMBOL dargs (SYMBOL :: dargs) | 352 | SYMBOL dargs (SYMBOL :: dargs) |
342 | 353 |
343 barOpt : () | 354 barOpt : () |
344 | BAR () | 355 | BAR () |
461 cargs : carg (carg) | 472 cargs : carg (carg) |
462 | cargl (cargl) | 473 | cargl (cargl) |
463 | 474 |
464 cargl : cargp cargp (cargp1 o cargp2) | 475 cargl : cargp cargp (cargp1 o cargp2) |
465 | cargp cargl (cargp o cargl) | 476 | cargp cargl (cargp o cargl) |
477 | |
478 cargl2 : (fn x => x) | |
479 | cargp cargl2 (cargp o cargl2) | |
466 | 480 |
467 carg : SYMBOL (fn (c, k) => | 481 carg : SYMBOL (fn (c, k) => |
468 let | 482 let |
469 val loc = s (SYMBOLleft, SYMBOLright) | 483 val loc = s (SYMBOLleft, SYMBOLright) |
470 in | 484 in |