comparison src/elab_util.sml @ 123:e3041657d653

Parsing and elaborating (non-mutual) 'val rec'
author Adam Chlipala <adamc@hcoop.net>
date Thu, 17 Jul 2008 10:09:34 -0400
parents 813e5a52063d
children 7420fa18d657
comparison
equal deleted inserted replaced
122:f7c6ceb87bbd 123:e3041657d653
502 (case #1 d of 502 (case #1 d of
503 DCon (x, _, k, _) => 503 DCon (x, _, k, _) =>
504 bind (ctx, NamedC (x, k)) 504 bind (ctx, NamedC (x, k))
505 | DVal (x, _, c, _) => 505 | DVal (x, _, c, _) =>
506 bind (ctx, NamedE (x, c)) 506 bind (ctx, NamedE (x, c))
507 | DValRec vis =>
508 foldl (fn ((x, _, c, _), ctx) => bind (ctx, NamedE (x, c))) ctx vis
507 | DSgn (x, _, sgn) => 509 | DSgn (x, _, sgn) =>
508 bind (ctx, Sgn (x, sgn)) 510 bind (ctx, Sgn (x, sgn))
509 | DStr (x, _, sgn, _) => 511 | DStr (x, _, sgn, _) =>
510 bind (ctx, Str (x, sgn)) 512 bind (ctx, Str (x, sgn))
511 | DFfiStr (x, _, sgn) => 513 | DFfiStr (x, _, sgn) =>
544 S.bind2 (mfk k, 546 S.bind2 (mfk k,
545 fn k' => 547 fn k' =>
546 S.map2 (mfc ctx c, 548 S.map2 (mfc ctx c,
547 fn c' => 549 fn c' =>
548 (DCon (x, n, k', c'), loc))) 550 (DCon (x, n, k', c'), loc)))
549 | DVal (x, n, c, e) => 551 | DVal vi =>
550 S.bind2 (mfc ctx c, 552 S.map2 (mfvi ctx vi,
551 fn c' => 553 fn vi' =>
552 S.map2 (mfe ctx e, 554 (DVal vi', loc))
553 fn e' => 555 | DValRec vis =>
554 (DVal (x, n, c', e'), loc))) 556 S.map2 (ListUtil.mapfold (mfvi ctx) vis,
557 fn vis' =>
558 (DValRec vis', loc))
555 | DSgn (x, n, sgn) => 559 | DSgn (x, n, sgn) =>
556 S.map2 (mfsg ctx sgn, 560 S.map2 (mfsg ctx sgn,
557 fn sgn' => 561 fn sgn' =>
558 (DSgn (x, n, sgn'), loc)) 562 (DSgn (x, n, sgn'), loc))
559 | DStr (x, n, sgn, str) => 563 | DStr (x, n, sgn, str) =>
576 S.bind2 (mfsg ctx sgn, 580 S.bind2 (mfsg ctx sgn,
577 fn sgn' => 581 fn sgn' =>
578 S.map2 (mfst ctx str, 582 S.map2 (mfst ctx str,
579 fn str' => 583 fn str' =>
580 (DExport (en, sgn', str'), loc))) 584 (DExport (en, sgn', str'), loc)))
585
586 and mfvi ctx (x, n, c, e) =
587 S.bind2 (mfc ctx c,
588 fn c' =>
589 S.map2 (mfe ctx e,
590 fn e' =>
591 (x, n, c', e')))
581 in 592 in
582 mfd 593 mfd
583 end 594 end
584 595
585 fun mapfold {kind, con, exp, sgn_item, sgn, str, decl} = 596 fun mapfold {kind, con, exp, sgn_item, sgn, str, decl} =