# HG changeset patch # User Adam Chlipala # Date 1223828514 14400 # Node ID 383c72d11db83c2957cbda730d1d03d911238f10 # Parent fa2d25fe75ce11b0e0e2cf594be2375c1d150981 Basis and Top syntax-highlight, indent, parse, and type-check diff -r fa2d25fe75ce -r 383c72d11db8 lib/basis.urs --- a/lib/basis.urs Sun Oct 12 11:50:21 2008 -0400 +++ b/lib/basis.urs Sun Oct 12 12:21:54 2008 -0400 @@ -207,7 +207,7 @@ -> fn [tables ~ exps] => state ::: Type -> sql_query tables exps - -> ($(exps ++ fold (fn nm (fields :: {Type}) [[nm] ~ acc] => + -> ($(exps ++ fold (fn nm (fields :: {Type}) acc [[nm] ~ acc] => [nm = $fields] ++ acc) [] tables) -> state -> transaction state) diff -r fa2d25fe75ce -r 383c72d11db8 lib/top.ur --- a/lib/top.ur Sun Oct 12 11:50:21 2008 -0400 +++ b/lib/top.ur Sun Oct 12 12:21:54 2008 -0400 @@ -1,111 +1,123 @@ -con idT = fn t :: Type => t -con record = fn t :: {Type} => $t -con fstTT = fn t :: (Type * Type) => t.1 -con sndTT = fn t :: (Type * Type) => t.2 +con idT (t :: Type) = t +con record (t :: {Type}) = $t +con fstTT (t :: (Type * Type)) = t.1 +con sndTT (t :: (Type * Type)) = t.2 -con mapTT (f :: Type -> Type) = fold (fn nm t acc => [nm] ~ acc => - [nm = f t] ++ acc) [] +con mapTT (f :: Type -> Type) = fold (fn nm t acc [[nm] ~ acc] => + [nm = f t] ++ acc) [] -con mapT2T (f :: (Type * Type) -> Type) = fold (fn nm t acc => [nm] ~ acc => - [nm = f t] ++ acc) [] +con mapT2T (f :: (Type * Type) -> Type) = fold (fn nm t acc [[nm] ~ acc] => + [nm = f t] ++ acc) [] con ex = fn tf :: (Type -> Type) => - res ::: Type -> (choice :: Type -> tf choice -> res) -> res + res ::: Type -> (choice :: Type -> tf choice -> res) -> res fun ex (tf :: (Type -> Type)) (choice :: Type) (body : tf choice) : ex tf = - fn (res ::: Type) (f : choice :: Type -> tf choice -> res) => - f [choice] body + fn (res ::: Type) (f : choice :: Type -> tf choice -> res) => + f [choice] body -fun compose (t1 ::: Type) (t2 ::: Type) (t3 ::: Type) (f1 : t2 -> t3) (f2 : t1 -> t2) (x : t1) = f1 (f2 x) +fun compose (t1 ::: Type) (t2 ::: Type) (t3 ::: Type) + (f1 : t2 -> t3) (f2 : t1 -> t2) (x : t1) = f1 (f2 x) -fun txt (t ::: Type) (ctx ::: {Unit}) (use ::: {Type}) (sh : show t) (v : t) = cdata (show sh v) +fun txt (t ::: Type) (ctx ::: {Unit}) (use ::: {Type}) (sh : show t) (v : t) = + cdata (show sh v) fun foldTR (tf :: Type -> Type) (tr :: {Type} -> Type) - (f : nm :: Name -> t :: Type -> rest :: {Type} -> [nm] ~ rest - => tf t -> tr rest -> tr ([nm = t] ++ rest)) - (i : tr []) = - fold [fn r :: {Type} => $(mapTT tf r) -> tr r] - (fn (nm :: Name) (t :: Type) (rest :: {Type}) (acc : _ -> tr rest) => - [[nm] ~ rest] => - fn r => f [nm] [t] [rest] r.nm (acc (r -- nm))) - (fn _ => i) + (f : nm :: Name -> t :: Type -> rest :: {Type} + -> fn [[nm] ~ rest] => + tf t -> tr rest -> tr ([nm = t] ++ rest)) + (i : tr []) = + fold [fn r :: {Type} => $(mapTT tf r) -> tr r] + (fn (nm :: Name) (t :: Type) (rest :: {Type}) (acc : _ -> tr rest) + [[nm] ~ rest] r => + f [nm] [t] [rest] r.nm (acc (r -- nm))) + (fn _ => i) fun foldT2R (tf :: (Type * Type) -> Type) (tr :: {(Type * Type)} -> Type) - (f : nm :: Name -> t :: (Type * Type) -> rest :: {(Type * Type)} -> [nm] ~ rest - => tf t -> tr rest -> tr ([nm = t] ++ rest)) + (f : nm :: Name -> t :: (Type * Type) -> rest :: {(Type * Type)} + -> fn [[nm] ~ rest] => + tf t -> tr rest -> tr ([nm = t] ++ rest)) (i : tr []) = - fold [fn r :: {(Type * Type)} => $(mapT2T tf r) -> tr r] - (fn (nm :: Name) (t :: (Type * Type)) (rest :: {(Type * Type)}) (acc : _ -> tr rest) => - [[nm] ~ rest] => - fn r => f [nm] [t] [rest] r.nm (acc (r -- nm))) - (fn _ => i) + fold [fn r :: {(Type * Type)} => $(mapT2T tf r) -> tr r] + (fn (nm :: Name) (t :: (Type * Type)) (rest :: {(Type * Type)}) + (acc : _ -> tr rest) [[nm] ~ rest] r => + f [nm] [t] [rest] r.nm (acc (r -- nm))) + (fn _ => i) fun foldTR2 (tf1 :: Type -> Type) (tf2 :: Type -> Type) (tr :: {Type} -> Type) - (f : nm :: Name -> t :: Type -> rest :: {Type} -> [nm] ~ rest - => tf1 t -> tf2 t -> tr rest -> tr ([nm = t] ++ rest)) + (f : nm :: Name -> t :: Type -> rest :: {Type} + -> fn [[nm] ~ rest] => + tf1 t -> tf2 t -> tr rest -> tr ([nm = t] ++ rest)) (i : tr []) = - fold [fn r :: {Type} => $(mapTT tf1 r) -> $(mapTT tf2 r) -> tr r] - (fn (nm :: Name) (t :: Type) (rest :: {Type}) (acc : _ -> _ -> tr rest) => - [[nm] ~ rest] => - fn r1 r2 => f [nm] [t] [rest] r1.nm r2.nm (acc (r1 -- nm) (r2 -- nm))) - (fn _ _ => i) + fold [fn r :: {Type} => $(mapTT tf1 r) -> $(mapTT tf2 r) -> tr r] + (fn (nm :: Name) (t :: Type) (rest :: {Type}) + (acc : _ -> _ -> tr rest) [[nm] ~ rest] r1 r2 => + f [nm] [t] [rest] r1.nm r2.nm (acc (r1 -- nm) (r2 -- nm))) + (fn _ _ => i) -fun foldT2R2 (tf1 :: (Type * Type) -> Type) (tf2 :: (Type * Type) -> Type) (tr :: {(Type * Type)} -> Type) - (f : nm :: Name -> t :: (Type * Type) -> rest :: {(Type * Type)} -> [nm] ~ rest - => tf1 t -> tf2 t -> tr rest -> tr ([nm = t] ++ rest)) - (i : tr []) = - fold [fn r :: {(Type * Type)} => $(mapT2T tf1 r) -> $(mapT2T tf2 r) -> tr r] - (fn (nm :: Name) (t :: (Type * Type)) (rest :: {(Type * Type)}) (acc : _ -> _ -> tr rest) => - [[nm] ~ rest] => - fn r1 r2 => f [nm] [t] [rest] r1.nm r2.nm (acc (r1 -- nm) (r2 -- nm))) - (fn _ _ => i) +fun foldT2R2 (tf1 :: (Type * Type) -> Type) (tf2 :: (Type * Type) -> Type) + (tr :: {(Type * Type)} -> Type) + (f : nm :: Name -> t :: (Type * Type) -> rest :: {(Type * Type)} + -> fn [[nm] ~ rest] => + tf1 t -> tf2 t -> tr rest -> tr ([nm = t] ++ rest)) + (i : tr []) = + fold [fn r :: {(Type * Type)} => $(mapT2T tf1 r) -> $(mapT2T tf2 r) -> tr r] + (fn (nm :: Name) (t :: (Type * Type)) (rest :: {(Type * Type)}) + (acc : _ -> _ -> tr rest) [[nm] ~ rest] r1 r2 => + f [nm] [t] [rest] r1.nm r2.nm (acc (r1 -- nm) (r2 -- nm))) + (fn _ _ => i) fun foldTRX (tf :: Type -> Type) (ctx :: {Unit}) - (f : nm :: Name -> t :: Type -> rest :: {Type} -> [nm] ~ rest - => tf t -> xml ctx [] []) = - foldTR [tf] [fn _ => xml ctx [] []] - (fn (nm :: Name) (t :: Type) (rest :: {Type}) => - [[nm] ~ rest] => - fn r acc => {f [nm] [t] [rest] r}{acc}) - + (f : nm :: Name -> t :: Type -> rest :: {Type} + -> fn [[nm] ~ rest] => + tf t -> xml ctx [] []) = + foldTR [tf] [fn _ => xml ctx [] []] + (fn (nm :: Name) (t :: Type) (rest :: {Type}) [[nm] ~ rest] r acc => + {f [nm] [t] [rest] r}{acc}) + fun foldT2RX (tf :: (Type * Type) -> Type) (ctx :: {Unit}) - (f : nm :: Name -> t :: (Type * Type) -> rest :: {(Type * Type)} -> [nm] ~ rest - => tf t -> xml ctx [] []) = - foldT2R [tf] [fn _ => xml ctx [] []] - (fn (nm :: Name) (t :: (Type * Type)) (rest :: {(Type * Type)}) => - [[nm] ~ rest] => - fn r acc => {f [nm] [t] [rest] r}{acc}) - + (f : nm :: Name -> t :: (Type * Type) -> rest :: {(Type * Type)} + -> fn [[nm] ~ rest] => + tf t -> xml ctx [] []) = + foldT2R [tf] [fn _ => xml ctx [] []] + (fn (nm :: Name) (t :: (Type * Type)) (rest :: {(Type * Type)}) + [[nm] ~ rest] r acc => + {f [nm] [t] [rest] r}{acc}) + fun foldTRX2 (tf1 :: Type -> Type) (tf2 :: Type -> Type) (ctx :: {Unit}) - (f : nm :: Name -> t :: Type -> rest :: {Type} -> [nm] ~ rest - => tf1 t -> tf2 t -> xml ctx [] []) = - foldTR2 [tf1] [tf2] [fn _ => xml ctx [] []] - (fn (nm :: Name) (t :: Type) (rest :: {Type}) => - [[nm] ~ rest] => - fn r1 r2 acc => {f [nm] [t] [rest] r1 r2}{acc}) - + (f : nm :: Name -> t :: Type -> rest :: {Type} + -> fn [[nm] ~ rest] => + tf1 t -> tf2 t -> xml ctx [] []) = + foldTR2 [tf1] [tf2] [fn _ => xml ctx [] []] + (fn (nm :: Name) (t :: Type) (rest :: {Type}) [[nm] ~ rest] + r1 r2 acc => + {f [nm] [t] [rest] r1 r2}{acc}) + -fun foldT2RX2 (tf1 :: (Type * Type) -> Type) (tf2 :: (Type * Type) -> Type) (ctx :: {Unit}) - (f : nm :: Name -> t :: (Type * Type) -> rest :: {(Type * Type)} -> [nm] ~ rest - => tf1 t -> tf2 t -> xml ctx [] []) = - foldT2R2 [tf1] [tf2] [fn _ => xml ctx [] []] - (fn (nm :: Name) (t :: (Type * Type)) (rest :: {(Type * Type)}) => - [[nm] ~ rest] => - fn r1 r2 acc => {f [nm] [t] [rest] r1 r2}{acc}) - +fun foldT2RX2 (tf1 :: (Type * Type) -> Type) (tf2 :: (Type * Type) -> Type) + (ctx :: {Unit}) + (f : nm :: Name -> t :: (Type * Type) -> rest :: {(Type * Type)} + -> fn [[nm] ~ rest] => + tf1 t -> tf2 t -> xml ctx [] []) = + foldT2R2 [tf1] [tf2] [fn _ => xml ctx [] []] + (fn (nm :: Name) (t :: (Type * Type)) (rest :: {(Type * Type)}) + [[nm] ~ rest] r1 r2 acc => + {f [nm] [t] [rest] r1 r2}{acc}) + -fun queryX (tables ::: {{Type}}) (exps ::: {Type}) (ctx ::: {Unit}) (q : sql_query tables exps) = - [tables ~ exps] => - fn (f : $(exps ++ fold (fn nm (fields :: {Type}) acc => [nm] ~ acc => [nm = $fields] ++ acc) [] tables) - -> xml ctx [] []) => - query q - (fn fs acc => return {acc}{f fs}) - +fun queryX (tables ::: {{Type}}) (exps ::: {Type}) (ctx ::: {Unit}) + (q : sql_query tables exps) [tables ~ exps] + (f : $(exps ++ fold (fn nm (fields :: {Type}) acc [[nm] ~ acc] => + [nm = $fields] ++ acc) [] tables) + -> xml ctx [] []) = + query q + (fn fs acc => return {acc}{f fs}) + -fun oneOrNoRows (tables ::: {{Type}}) (exps ::: {Type}) (q : sql_query tables exps) = - [tables ~ exps] => - query q - (fn fs _ => return (Some fs)) - None +fun oneOrNoRows (tables ::: {{Type}}) (exps ::: {Type}) + (q : sql_query tables exps) [tables ~ exps] = + query q + (fn fs _ => return (Some fs)) + None diff -r fa2d25fe75ce -r 383c72d11db8 src/urweb.grm --- a/src/urweb.grm Sun Oct 12 11:50:21 2008 -0400 +++ b/src/urweb.grm Sun Oct 12 12:21:54 2008 -0400 @@ -714,13 +714,6 @@ ((EAbs ("_", SOME cexp, e), loc), (TFun (cexp, t), loc)) end) - | cterm TWIDDLE cterm (fn (e, t) => - let - val loc = s (cterm1left, cterm2right) - in - ((EDisjoint (cterm1, cterm2, e), loc), - (CDisjoint (cterm1, cterm2, t), loc)) - end) | eargp (eargp) eargp : SYMBOL (fn (e, t) => @@ -773,6 +766,13 @@ ((EDisjoint (cterm1, cterm2, e), loc), (CDisjoint (cterm1, cterm2, t), loc)) end) + | LBRACK cterm TWIDDLE cterm RBRACK(fn (e, t) => + let + val loc = s (LBRACKleft, RBRACKright) + in + ((EDisjoint (cterm1, cterm2, e), loc), + (CDisjoint (cterm1, cterm2, t), loc)) + end) eterm : LPAREN eexp RPAREN (#1 eexp, s (LPARENleft, RPARENright)) | LPAREN etuple RPAREN (let