projects
/
fw
/
altos
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
altos/scheme: Add separate floor-quotient builtin
[fw/altos]
/
src
/
scheme
/
ao_scheme_builtin.c
diff --git
a/src/scheme/ao_scheme_builtin.c
b/src/scheme/ao_scheme_builtin.c
index 81fd901058fa7967332328d773e1c5297148a48c..e2532c98746a331ae248ace4f825ab41c4d1d874 100644
(file)
--- 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");
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
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:
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");
case builtin_remainder:
case builtin_modulo:
return ao_scheme_error(AO_SCHEME_INVALID, "non-integer value in integer divide");
@@
-491,6
+497,12
@@
ao_scheme_do_quotient(struct ao_scheme_cons *cons)
return ao_scheme_math(cons, builtin_quotient);
}
return ao_scheme_math(cons, builtin_quotient);
}
+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)
{
ao_poly
ao_scheme_do_modulo(struct ao_scheme_cons *cons)
{