Mercurial > urweb
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} = |