summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/scheme/ao_scheme_builtin.c12
-rw-r--r--src/scheme/ao_scheme_builtin.txt1
2 files changed, 13 insertions, 0 deletions
diff --git a/src/scheme/ao_scheme_builtin.c b/src/scheme/ao_scheme_builtin.c
index 81fd9010..e2532c98 100644
--- a/src/scheme/ao_scheme_builtin.c
+++ b/src/scheme/ao_scheme_builtin.c
@@ -393,6 +393,11 @@ ao_scheme_math(struct ao_scheme_cons *orig_cons, enum ao_scheme_builtin_id op)
case builtin_quotient:
if (c == 0)
return ao_scheme_error(AO_SCHEME_DIVIDE_BY_ZERO, "quotient by zero");
+ r = r / c;
+ break;
+ case builtin_floor_quotient:
+ if (c == 0)
+ return ao_scheme_error(AO_SCHEME_DIVIDE_BY_ZERO, "floor-quotient by zero");
if (r % c != 0 && (c < 0) != (r < 0))
r = r / c - 1;
else
@@ -436,6 +441,7 @@ ao_scheme_math(struct ao_scheme_cons *orig_cons, enum ao_scheme_builtin_id op)
r /= c;
break;
case builtin_quotient:
+ case builtin_floor_quotient:
case builtin_remainder:
case builtin_modulo:
return ao_scheme_error(AO_SCHEME_INVALID, "non-integer value in integer divide");
@@ -492,6 +498,12 @@ ao_scheme_do_quotient(struct ao_scheme_cons *cons)
}
ao_poly
+ao_scheme_do_floor_quotient(struct ao_scheme_cons *cons)
+{
+ return ao_scheme_math(cons, builtin_floor_quotient);
+}
+
+ao_poly
ao_scheme_do_modulo(struct ao_scheme_cons *cons)
{
return ao_scheme_math(cons, builtin_modulo);
diff --git a/src/scheme/ao_scheme_builtin.txt b/src/scheme/ao_scheme_builtin.txt
index 23adf6ed..bdadbd6a 100644
--- a/src/scheme/ao_scheme_builtin.txt
+++ b/src/scheme/ao_scheme_builtin.txt
@@ -31,6 +31,7 @@ all f_lambda divide /
all f_lambda modulo modulo %
all f_lambda remainder
all f_lambda quotient
+all f_lambda floor_quotient floor-quotient
all f_lambda equal = eq? eqv?
all f_lambda less < string<?
all f_lambda greater > string>?