diff options
| -rw-r--r-- | src/scheme/ao_scheme_builtin.c | 12 | ||||
| -rw-r--r-- | src/scheme/ao_scheme_builtin.txt | 1 | 
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>? | 
