# HG changeset patch # User Adam Chlipala # Date 1221172361 14400 # Node ID 950320f3323250f6c5dfc3a8e99e7e4f950854d1 # Parent e457d8972ff1b538133cddd02e691211ae2eb531 Crud list works diff -r e457d8972ff1 -r 950320f33232 lib/basis.urs --- a/lib/basis.urs Thu Sep 11 17:41:52 2008 -0400 +++ b/lib/basis.urs Thu Sep 11 18:32:41 2008 -0400 @@ -251,6 +251,7 @@ con xhtml = xml [Html] con page = xhtml [] [] con xbody = xml [Body] [] [] +con xtr = xml [Body, Tr] [] [] (*** HTML details *) diff -r e457d8972ff1 -r 950320f33232 src/disjoint.sml --- a/src/disjoint.sml Thu Sep 11 17:41:52 2008 -0400 +++ b/src/disjoint.sml Thu Sep 11 18:32:41 2008 -0400 @@ -199,6 +199,8 @@ | _ => (Unknown cAll :: acc, gs) end in + (*Print.prefaces "decomposeRow'" [("c", ElabPrint.p_con env c), + ("c'", ElabPrint.p_con env (#1 (hnormCon (env, denv) c)))];*) case #1 (#1 (hnormCon (env, denv) c)) of CApp ( (CApp ( diff -r e457d8972ff1 -r 950320f33232 src/elab_ops.sml --- a/src/elab_ops.sml Thu Sep 11 17:41:52 2008 -0400 +++ b/src/elab_ops.sml Thu Sep 11 18:32:41 2008 -0400 @@ -98,36 +98,40 @@ ("sc", p_con env sc)];*) sc end - | CApp (c', i) => - (case #1 (hnormCon env c') of - CApp (c', f) => - (case #1 (hnormCon env c') of - CFold ks => - (case #1 (hnormCon env c2) of - CRecord (_, []) => hnormCon env i - | CRecord (k, (x, c) :: rest) => - hnormCon env - (CApp ((CApp ((CApp (f, x), loc), c), loc), + | c1' as CApp (c', i) => + let + fun default () = (CApp ((c1', loc), hnormCon env c2), loc) + in + case #1 (hnormCon env c') of + CApp (c', f) => + (case #1 (hnormCon env c') of + CFold ks => + (case #1 (hnormCon env c2) of + CRecord (_, []) => hnormCon env i + | CRecord (k, (x, c) :: rest) => + hnormCon env + (CApp ((CApp ((CApp (f, x), loc), c), loc), (CApp ((CApp ((CApp ((CFold ks, loc), f), loc), i), loc), - (CRecord (k, rest), loc)), loc)), loc) - | CConcat ((CRecord (k, (x, c) :: rest), _), rest') => - let - val rest'' = (CConcat ((CRecord (k, rest), loc), rest'), loc) + (CRecord (k, rest), loc)), loc)), loc) + | CConcat ((CRecord (k, (x, c) :: rest), _), rest') => + let + val rest'' = (CConcat ((CRecord (k, rest), loc), rest'), loc) - (*val ccc = (CApp ((CApp ((CApp (f, x), loc), c), loc), + (*val ccc = (CApp ((CApp ((CApp (f, x), loc), c), loc), + (CApp ((CApp ((CApp ((CFold ks, loc), f), loc), i), loc), + rest''), loc)), loc)*) + in + (*eprefaces "Red to" [("ccc", p_con env ccc), ("ccc'", p_con env (hnormCon env ccc))];*) + hnormCon env + (CApp ((CApp ((CApp (f, x), loc), c), loc), (CApp ((CApp ((CApp ((CFold ks, loc), f), loc), i), loc), - rest''), loc)), loc)*) - in - (*eprefaces "Red to" [("ccc", p_con env ccc), ("ccc'", p_con env (hnormCon env ccc))];*) - hnormCon env - (CApp ((CApp ((CApp (f, x), loc), c), loc), - (CApp ((CApp ((CApp ((CFold ks, loc), f), loc), i), loc), - rest''), loc)), loc) - end - | _ => cAll) - | _ => cAll) - | _ => cAll) - | _ => cAll) + rest''), loc)), loc) + end + | _ => default ()) + | _ => default ()) + | _ => default () + end + | c1' => (CApp ((c1', loc), hnormCon env c2), loc)) | CConcat (c1, c2) => (case (hnormCon env c1, hnormCon env c2) of diff -r e457d8972ff1 -r 950320f33232 src/elaborate.sml --- a/src/elaborate.sml Thu Sep 11 17:41:52 2008 -0400 +++ b/src/elaborate.sml Thu Sep 11 18:32:41 2008 -0400 @@ -896,17 +896,28 @@ end and unifyCons' (env, denv) c1 c2 = - let - val (c1, gs1) = hnormCon (env, denv) c1 - val (c2, gs2) = hnormCon (env, denv) c2 - in + case (#1 c1, #1 c2) of + (L'.TDisjoint (x1, y1, t1), L'.TDisjoint (x2, y2, t2)) => let - val gs3 = unifyCons'' (env, denv) c1 c2 + val gs1 = unifyCons' (env, denv) x1 x2 + val gs2 = unifyCons' (env, denv) y1 y2 + val (denv', gs3) = D.assert env denv (x1, y1) + val gs4 = unifyCons' (env, denv') t1 t2 in - gs1 @ gs2 @ gs3 + gs1 @ gs2 @ gs3 @ gs4 end - handle ex => guessFold (env, denv) (c1, c2, gs1 @ gs2, ex) - end + | _ => + let + val (c1, gs1) = hnormCon (env, denv) c1 + val (c2, gs2) = hnormCon (env, denv) c2 + in + let + val gs3 = unifyCons'' (env, denv) c1 c2 + in + gs1 @ gs2 @ gs3 + end + handle ex => guessFold (env, denv) (c1, c2, gs1 @ gs2, ex) + end and unifyCons'' (env, denv) (c1All as (c1, loc)) (c2All as (c2, _)) = let @@ -1116,12 +1127,18 @@ (L'.TCFun (L'.Explicit, "v", dom, (L'.TCFun (L'.Explicit, "rest", (L'.KRecord dom, loc), (L'.TFun ((L'.CApp ((L'.CRel 3, loc), (L'.CRel 0, loc)), loc), - (L'.CApp ((L'.CRel 3, loc), - recCons (dom, - (L'.CRel 2, loc), - (L'.CRel 1, loc), - (L'.CRel 0, loc), - loc)), loc)), loc)), + (L'.TDisjoint ((L'.CRecord + ((L'.KUnit, loc), + [((L'.CRel 2, loc), + (L'.CUnit, loc))]), loc), + (L'.CRel 0, loc), + (L'.CApp ((L'.CRel 3, loc), + recCons (dom, + (L'.CRel 2, loc), + (L'.CRel 1, loc), + (L'.CRel 0, loc), + loc)), loc)), + loc)), loc)), loc)), loc)), loc), (L'.TFun ((L'.CApp ((L'.CRel 0, loc), (L'.CRecord (dom, []), loc)), loc), (L'.TCFun (L'.Explicit, "r", (L'.KRecord dom, loc), diff -r e457d8972ff1 -r 950320f33232 tests/crud.ur --- a/tests/crud.ur Thu Sep 11 17:41:52 2008 -0400 +++ b/tests/crud.ur Thu Sep 11 18:32:41 2008 -0400 @@ -1,3 +1,5 @@ +con colMeta = fn cols :: {Type} => $(Top.mapTT (fn t => {Show : t -> xbody}) cols) + functor Make(M : sig con cols :: {Type} constraint [Id] ~ cols @@ -5,7 +7,7 @@ val title : string - val cols : $(mapTT (fn t => {Show : t -> xbody}) cols) + val cols : $(Top.mapTT (fn t => {Show : t -> xbody}) cols) end) = struct open constraints M @@ -14,7 +16,20 @@ fun list () = rows <- query (SELECT * FROM tab AS T) (fn fs acc => return - {acc} {txt _ fs.T.Id} + {acc} + + {txt _ fs.T.Id} + {fold [fn cols :: {Type} => $cols -> colMeta cols -> xtr] + (fn (nm :: Name) (t :: Type) (rest :: {Type}) acc => + [[nm] ~ rest] => + fn (r : $([nm = t] ++ rest)) cols => + + {cols.nm.Show r.nm} + {acc (r -- nm) (cols -- nm)} + ) + (fn _ _ => ) + [M.cols] (fs.T -- #Id) M.cols} + ) ; return List diff -r e457d8972ff1 -r 950320f33232 tests/crud.urs --- a/tests/crud.urs Thu Sep 11 17:41:52 2008 -0400 +++ b/tests/crud.urs Thu Sep 11 18:32:41 2008 -0400 @@ -1,3 +1,5 @@ +con colMeta = fn cols :: {Type} => $(mapTT (fn t => {Show : t -> xbody}) cols) + functor Make(M : sig con cols :: {Type} constraint [Id] ~ cols @@ -5,7 +7,7 @@ val title : string - val cols : $(mapTT (fn t => {Show : t -> xbody}) cols) + val cols : colMeta cols end) : sig val main : unit -> transaction page end