3 RATIO* ratio(CELL numerator, CELL denominator)
5 RATIO* ratio = (RATIO*)allot(sizeof(RATIO));
6 ratio->numerator = numerator;
7 ratio->denominator = denominator;
11 void primitive_ratiop(void)
13 check_non_empty(env.dt);
14 env.dt = tag_boolean(typep(RATIO_TYPE,env.dt));
17 void primitive_numerator(void)
19 switch(type_of(env.dt))
26 env.dt = untag_ratio(env.dt)->numerator;
29 type_error(RATIO_TYPE,env.dt);
34 void primitive_denominator(void)
36 switch(type_of(env.dt))
40 env.dt = tag_fixnum(1);
43 env.dt = untag_ratio(env.dt)->denominator;
46 type_error(RATIO_TYPE,env.dt);
51 CELL number_eq_ratio(CELL x, CELL y)
53 RATIO* rx = (RATIO*)UNTAG(x);
54 RATIO* ry = (RATIO*)UNTAG(y);
56 untag_boolean(number_eq(rx->numerator,ry->numerator)) &&
57 untag_boolean(number_eq(rx->denominator,ry->denominator)));
60 CELL add_ratio(CELL x, CELL y)
62 RATIO* rx = (RATIO*)UNTAG(x);
63 RATIO* ry = (RATIO*)UNTAG(y);
64 return divide(add(multiply(rx->numerator,ry->denominator),
65 multiply(rx->denominator,ry->numerator)),
66 multiply(rx->denominator,ry->denominator));
69 CELL subtract_ratio(CELL x, CELL y)
71 RATIO* rx = (RATIO*)UNTAG(x);
72 RATIO* ry = (RATIO*)UNTAG(y);
73 return divide(subtract(multiply(rx->numerator,ry->denominator),
74 multiply(rx->denominator,ry->numerator)),
75 multiply(rx->denominator,ry->denominator));
78 CELL multiply_ratio(CELL x, CELL y)
80 RATIO* rx = (RATIO*)UNTAG(x);
81 RATIO* ry = (RATIO*)UNTAG(y);
83 multiply(rx->numerator,ry->numerator),
84 multiply(rx->denominator,ry->denominator));
87 CELL divide_ratio(CELL x, CELL y)
89 RATIO* rx = (RATIO*)UNTAG(x);
90 RATIO* ry = (RATIO*)UNTAG(y);
92 multiply(rx->numerator,ry->denominator),
93 multiply(rx->denominator,ry->numerator));
96 CELL divfloat_ratio(CELL x, CELL y)
98 RATIO* rx = (RATIO*)UNTAG(x);
99 RATIO* ry = (RATIO*)UNTAG(y);
101 multiply(rx->numerator,ry->denominator),
102 multiply(rx->denominator,ry->numerator));
105 CELL less_ratio(CELL x, CELL y)
107 RATIO* rx = (RATIO*)UNTAG(x);
108 RATIO* ry = (RATIO*)UNTAG(y);
109 return less(multiply(rx->numerator,ry->denominator),
110 multiply(ry->numerator,rx->denominator));
113 CELL lesseq_ratio(CELL x, CELL y)
115 RATIO* rx = (RATIO*)UNTAG(x);
116 RATIO* ry = (RATIO*)UNTAG(y);
117 return lesseq(multiply(rx->numerator,ry->denominator),
118 multiply(ry->numerator,rx->denominator));
121 CELL greater_ratio(CELL x, CELL y)
123 RATIO* rx = (RATIO*)UNTAG(x);
124 RATIO* ry = (RATIO*)UNTAG(y);
125 return greater(multiply(rx->numerator,ry->denominator),
126 multiply(ry->numerator,rx->denominator));
129 CELL greatereq_ratio(CELL x, CELL y)
131 RATIO* rx = (RATIO*)UNTAG(x);
132 RATIO* ry = (RATIO*)UNTAG(y);
133 return greatereq(multiply(rx->numerator,ry->denominator),
134 multiply(ry->numerator,rx->denominator));