Mercurial > urweb
changeset 1831:36428d853c97
Standard library additions: Option.unsafeGet, Basis.exp
author | Austin Seipp <mad.one@gmail.com> |
---|---|
date | Wed, 28 Nov 2012 11:41:54 -0500 (2012-11-28) |
parents | d636d33fd8a2 |
children | 373e2c3f03b2 |
files | lib/ur/basis.urs lib/ur/option.ur lib/ur/option.urs src/monoize.sml |
diffstat | 4 files changed, 27 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/lib/ur/basis.urs Wed Nov 28 11:39:38 2012 -0500 +++ b/lib/ur/basis.urs Wed Nov 28 11:41:54 2012 -0500 @@ -42,6 +42,7 @@ val times : t ::: Type -> num t -> t -> t -> t val divide : t ::: Type -> num t -> t -> t -> t val mod : t ::: Type -> num t -> t -> t -> t +val exp : t ::: Type -> num t -> t -> t -> t val num_int : num int val num_float : num float
--- a/lib/ur/option.ur Wed Nov 28 11:39:38 2012 -0500 +++ b/lib/ur/option.ur Wed Nov 28 11:41:54 2012 -0500 @@ -49,3 +49,8 @@ case o of None => x | Some v => v + +fun unsafeGet [a] (o : option a) = + case o of + None => error <xml>Option.unsafeGet: encountered None</xml> + | Some v => v
--- a/lib/ur/option.urs Wed Nov 28 11:39:38 2012 -0500 +++ b/lib/ur/option.urs Wed Nov 28 11:41:54 2012 -0500 @@ -12,3 +12,4 @@ val bind : a ::: Type -> b ::: Type -> (a -> option b) -> t a -> t b val get : a ::: Type -> a -> option a -> a +val unsafeGet : a ::: Type -> option a -> a
--- a/src/monoize.sml Wed Nov 28 11:39:38 2012 -0500 +++ b/src/monoize.sml Wed Nov 28 11:41:54 2012 -0500 @@ -191,7 +191,8 @@ ("Minus", (L'.TFun (t, (L'.TFun (t, t), loc)), loc)), ("Times", (L'.TFun (t, (L'.TFun (t, t), loc)), loc)), ("Div", (L'.TFun (t, (L'.TFun (t, t), loc)), loc)), - ("Mod", (L'.TFun (t, (L'.TFun (t, t), loc)), loc))], + ("Mod", (L'.TFun (t, (L'.TFun (t, t), loc)), loc)), + ("Exp", (L'.TFun (t, (L'.TFun (t, t), loc)), loc))], loc) end | L.CApp ((L.CFfi ("Basis", "ord"), _), t) => @@ -791,15 +792,17 @@ ("Minus", (L'.TFun (t, (L'.TFun (t, t), loc)), loc)), ("Times", (L'.TFun (t, (L'.TFun (t, t), loc)), loc)), ("Div", (L'.TFun (t, (L'.TFun (t, t), loc)), loc)), - ("Mod", (L'.TFun (t, (L'.TFun (t, t), loc)), loc))], loc) - fun numEx (t, zero, neg, plus, minus, times, dv, md) = + ("Mod", (L'.TFun (t, (L'.TFun (t, t), loc)), loc)), + ("Exp", (L'.TFun (t, (L'.TFun (t, t), loc)), loc))], loc) + fun numEx (t, zero, neg, plus, minus, times, dv, md, ex) = ((L'.ERecord [("Zero", (L'.EPrim zero, loc), t), ("Neg", neg, (L'.TFun (t, t), loc)), ("Plus", plus, (L'.TFun (t, (L'.TFun (t, t), loc)), loc)), ("Minus", minus, (L'.TFun (t, (L'.TFun (t, t), loc)), loc)), ("Times", times, (L'.TFun (t, (L'.TFun (t, t), loc)), loc)), ("Div", dv, (L'.TFun (t, (L'.TFun (t, t), loc)), loc)), - ("Mod", md, (L'.TFun (t, (L'.TFun (t, t), loc)), loc))], loc), fm) + ("Mod", md, (L'.TFun (t, (L'.TFun (t, t), loc)), loc)), + ("Exp", ex, (L'.TFun (t, (L'.TFun (t, t), loc)), loc))], loc), fm) fun ordTy t = (L'.TRecord [("Lt", (L'.TFun (t, (L'.TFun (t, (L'.TFfi ("Basis", "bool"), loc)), loc)), loc)), @@ -1029,6 +1032,13 @@ ((L'.EAbs ("r", numTy t, (L'.TFun (t, (L'.TFun (t, t), loc)), loc), (L'.EField ((L'.ERel 0, loc), "Mod"), loc)), loc), fm) end + | L.ECApp ((L.EFfi ("Basis", "exp"), _), t) => + let + val t = monoType env t + in + ((L'.EAbs ("r", numTy t, (L'.TFun (t, (L'.TFun (t, t), loc)), loc), + (L'.EField ((L'.ERel 0, loc), "Exp"), loc)), loc), fm) + end | L.EFfi ("Basis", "num_int") => let fun intBin s = @@ -1047,7 +1057,9 @@ intBin "-", intBin "*", intBin "/", - intBin "%") + intBin "%", + intBin "powl" + ) end | L.EFfi ("Basis", "num_float") => let @@ -1067,7 +1079,9 @@ floatBin "-", floatBin "*", floatBin "fdiv", - floatBin "fmod") + floatBin "fmod", + floatBin "powf" + ) end | L.ECApp ((L.EFfi ("Basis", "lt"), _), t) =>