50 lines
823 B
C
50 lines
823 B
C
|
#include "factor.h"
|
||
|
|
||
|
RATIO* ratio(CELL numerator, CELL denominator)
|
||
|
{
|
||
|
RATIO* ratio = (RATIO*)allot(sizeof(RATIO));
|
||
|
ratio->numerator = numerator;
|
||
|
ratio->denominator = denominator;
|
||
|
return ratio;
|
||
|
}
|
||
|
|
||
|
void primitive_ratiop(void)
|
||
|
{
|
||
|
check_non_empty(env.dt);
|
||
|
env.dt = tag_boolean(typep(RATIO_TYPE,env.dt));
|
||
|
}
|
||
|
|
||
|
void primitive_numerator(void)
|
||
|
{
|
||
|
switch(type_of(env.dt))
|
||
|
{
|
||
|
case FIXNUM_TYPE:
|
||
|
case BIGNUM_TYPE:
|
||
|
/* No op */
|
||
|
break;
|
||
|
case RATIO_TYPE:
|
||
|
env.dt = untag_ratio(env.dt)->numerator;
|
||
|
break;
|
||
|
default:
|
||
|
type_error(RATIO_TYPE,env.dt);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void primitive_denominator(void)
|
||
|
{
|
||
|
switch(type_of(env.dt))
|
||
|
{
|
||
|
case FIXNUM_TYPE:
|
||
|
case BIGNUM_TYPE:
|
||
|
env.dt = tag_fixnum(1);
|
||
|
break;
|
||
|
case RATIO_TYPE:
|
||
|
env.dt = untag_ratio(env.dt)->denominator;
|
||
|
break;
|
||
|
default:
|
||
|
type_error(RATIO_TYPE,env.dt);
|
||
|
break;
|
||
|
}
|
||
|
}
|