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
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) =>