comparison src/corify.sml @ 182:d11754ffe252

Compiled pattern matching to C
author Adam Chlipala <adamc@hcoop.net>
date Sun, 03 Aug 2008 12:43:20 -0400
parents 5d030ee143e2
children 19ee24bffbc0
comparison
equal deleted inserted replaced
181:31dfab1d4050 182:d11754ffe252
409 end 409 end
410 410
411 fun corifyPat st (p, loc) = 411 fun corifyPat st (p, loc) =
412 case p of 412 case p of
413 L.PWild => (L'.PWild, loc) 413 L.PWild => (L'.PWild, loc)
414 | L.PVar x => (L'.PVar x, loc) 414 | L.PVar (x, t) => (L'.PVar (x, corifyCon st t), loc)
415 | L.PPrim p => (L'.PPrim p, loc) 415 | L.PPrim p => (L'.PPrim p, loc)
416 | L.PCon (pc, po) => (L'.PCon (corifyPatCon st pc, Option.map (corifyPat st) po), loc) 416 | L.PCon (pc, po) => (L'.PCon (corifyPatCon st pc, Option.map (corifyPat st) po), loc)
417 | L.PRecord xps => (L'.PRecord (map (fn (x, p) => (x, corifyPat st p)) xps), loc) 417 | L.PRecord xps => (L'.PRecord (map (fn (x, p, t) => (x, corifyPat st p, corifyCon st t)) xps), loc)
418 418
419 fun corifyExp st (e, loc) = 419 fun corifyExp st (e, loc) =
420 case e of 420 case e of
421 L.EPrim p => (L'.EPrim p, loc) 421 L.EPrim p => (L'.EPrim p, loc)
422 | L.ERel n => (L'.ERel n, loc) 422 | L.ERel n => (L'.ERel n, loc)
471 {field = corifyCon st field, rest = corifyCon st rest}), loc) 471 {field = corifyCon st field, rest = corifyCon st rest}), loc)
472 | L.ECut (e1, c, {field, rest}) => (L'.ECut (corifyExp st e1, corifyCon st c, 472 | L.ECut (e1, c, {field, rest}) => (L'.ECut (corifyExp st e1, corifyCon st c,
473 {field = corifyCon st field, rest = corifyCon st rest}), loc) 473 {field = corifyCon st field, rest = corifyCon st rest}), loc)
474 | L.EFold k => (L'.EFold (corifyKind k), loc) 474 | L.EFold k => (L'.EFold (corifyKind k), loc)
475 475
476 | L.ECase (e, pes, t) => (L'.ECase (corifyExp st e, 476 | L.ECase (e, pes, {disc, result}) =>
477 map (fn (p, e) => (corifyPat st p, corifyExp st e)) pes, 477 (L'.ECase (corifyExp st e,
478 corifyCon st t), 478 map (fn (p, e) => (corifyPat st p, corifyExp st e)) pes,
479 loc) 479 {disc = corifyCon st disc, result = corifyCon st result}),
480 loc)
480 481
481 | L.EWrite e => (L'.EWrite (corifyExp st e), loc) 482 | L.EWrite e => (L'.EWrite (corifyExp st e), loc)
482 483
483 fun corifyDecl ((d, loc : EM.span), st) = 484 fun corifyDecl ((d, loc : EM.span), st) =
484 case d of 485 case d of