core: Throw exceptions rather than asserts.
[mes.git] / math.c
diff --git a/math.c b/math.c
index 8a9c023b5a5ad60244c76ae2be14de9822ebac22..b2ca402edd13ec4c7574fa8411d9f2618513fea2 100644 (file)
--- a/math.c
+++ b/math.c
@@ -76,7 +76,7 @@ minus (SCM x) ///((name . "-") (arity . n))
       n -= VALUE (car (x));
       x = cdr (x);
     }
-  return make_number (n);
+  return MAKE_NUMBER (n);
 }
 
 SCM
@@ -89,7 +89,7 @@ plus (SCM x) ///((name . "+") (arity . n))
       n += VALUE (car (x));
       x = cdr (x);
     }
-  return make_number (n);
+  return MAKE_NUMBER (n);
 }
 
 SCM
@@ -107,7 +107,7 @@ divide (SCM x) ///((name . "/") (arity . n))
       n /= VALUE (car (x));
       x = cdr (x);
     }
-  return make_number (n);
+  return MAKE_NUMBER (n);
 }
 
 SCM
@@ -115,7 +115,9 @@ modulo (SCM a, SCM b)
 {
   assert (TYPE (a) == NUMBER);
   assert (TYPE (b) == NUMBER);
-  return make_number (VALUE (a) % VALUE (b));
+  int x = VALUE (a);
+  while (x < 0) x += VALUE (b);
+  return MAKE_NUMBER (x % VALUE (b));
 }
 
 SCM
@@ -128,7 +130,7 @@ multiply (SCM x) ///((name . "*") (arity . n))
       n *= VALUE (car (x));
       x = cdr (x);
     }
-  return make_number (n);
+  return MAKE_NUMBER (n);
 }
 
 SCM
@@ -141,5 +143,15 @@ logior (SCM x) ///((arity . n))
       n |= VALUE (car (x));
       x = cdr (x);
     }
-  return make_number (n);
+  return MAKE_NUMBER (n);
+}
+
+SCM
+ash (SCM n, SCM count)
+{
+  assert (TYPE (n) == NUMBER);
+  assert (TYPE (count) == NUMBER);
+  int cn = VALUE (n);
+  int ccount = VALUE (count);
+  return MAKE_NUMBER ((ccount < 0) ? cn >> -ccount : cn << ccount);
 }