diff options
author | Adam Chlipala <adamc@hcoop.net> | 2008-07-13 11:43:57 -0400 |
---|---|---|
committer | Adam Chlipala <adamc@hcoop.net> | 2008-07-13 11:43:57 -0400 |
commit | 95d278b9b8e9c314541b8251a34a32fe6deeb896 (patch) | |
tree | f0f262173a66272d9d91248844f2facc40cc65a2 /src/core_util.sml | |
parent | 3316f3c317e587a5fc2ecf38f061a72b48e3b94e (diff) |
Starting with closure links
Diffstat (limited to 'src/core_util.sml')
-rw-r--r-- | src/core_util.sml | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/src/core_util.sml b/src/core_util.sml index 11d70de9..427a313d 100644 --- a/src/core_util.sml +++ b/src/core_util.sml @@ -291,6 +291,11 @@ fun mapfoldB {kind = fk, con = fc, exp = fe, bind} = S.map2 (mfe ctx e, fn e' => (EWrite e', loc)) + + | EClosure (n, es) => + S.map2 (ListUtil.mapfold (mfe ctx) es, + fn es' => + (EClosure (n, es'), loc)) in mfe end @@ -401,6 +406,14 @@ fun fold {kind, con, exp, decl} s d = S.Continue (_, s) => s | S.Return _ => raise Fail "CoreUtil.Decl.fold: Impossible" +fun foldMap {kind, con, exp, decl} s d = + case mapfold {kind = fn k => fn s => S.Continue (kind (k, s)), + con = fn c => fn s => S.Continue (con (c, s)), + exp = fn e => fn s => S.Continue (exp (e, s)), + decl = fn d => fn s => S.Continue (decl (d, s))} d s of + S.Continue v => v + | S.Return _ => raise Fail "CoreUtil.Decl.foldMap: Impossible" + end structure File = struct @@ -456,6 +469,14 @@ fun fold {kind, con, exp, decl} s d = S.Continue (_, s) => s | S.Return _ => raise Fail "CoreUtil.File.fold: Impossible" +fun foldMap {kind, con, exp, decl} s d = + case mapfold {kind = fn k => fn s => S.Continue (kind (k, s)), + con = fn c => fn s => S.Continue (con (c, s)), + exp = fn e => fn s => S.Continue (exp (e, s)), + decl = fn d => fn s => S.Continue (decl (d, s))} d s of + S.Continue v => v + | S.Return _ => raise Fail "CoreUtil.File.foldMap: Impossible" + end end |