diff options
Diffstat (limited to 'examples')
-rw-r--r-- | examples/math.c | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/examples/math.c b/examples/math.c new file mode 100644 index 0000000..df0aabc --- /dev/null +++ b/examples/math.c @@ -0,0 +1,70 @@ +#include <csx.h> + + +v def_rat_sum(v construct, v numer, v denom) +{ + v a = atom("a"); + v b = atom("b"); + return el(define, l(atom("rat_sum"), a, b), + l(construct, l(sum, l(mul, l(numer, a), l(denom, b)), + l(mul, l(numer, b), l(denom, a))), + l(mul, l(denom, a), l(denom, b))) + ); +} + +v def_rat_sum(v construct, v numer, v denom) +{ + v a = atom("a"); + v b = atom("b"); + return el(define, l(atom("rat_sub"), a, b), + l(construct, l(sub, l(mul, l(numer, a), l(denom, b)), + l(mul, l(numer, b), l(denom, a))), + l(mul, l(denom, a), l(denom, b))) + ); +} + +v def_rat_equ(v construct, v numer, v denom) +{ + v a = atom("a"); + v b = atom("b"); + return el(define, l(atom("rat_equ"), a, b), + l(equ, l(mul, l(numer, a), l(denom, b)), + l(mul, l(numer, b), l(denom, a))) + ); +} + +void printres(v a, v b, v absum, v absub, int *are_equ, v numer, v denom) +{ + int an = *(int *)el(numer, a); + int ad = *(int *)el(denom, a); + int bn = *(int *)el(numer, b); + int bd = *(int *)el(denom, b); + int sumn = *(int *)el(numer, absum); + int sumd = *(int *)el(denom, absum); + int subn = *(int *)el(numer, absub); + int subd = *(int *)el(denom, absub); + printf("%d/%d + %d/%d = %d/%d\n", an, ad, bn, bd, sumn, sumd); + printf("%d/%d - %d/%d = %d/%d\n", an, ad, bn, bd, subn, subd); + if (*are_equ) { + puts("And they are equal.\n"); + } else { + puts("And they are not equal.\n"); + } +} + +int main() +{ + v rat = l(define, atom("rat"), cons); + v rat_numer = l(define, atom("rat_numer"), car); + v rat_denom = l(define, atom("rat_denom"), cdr); + v rat_sum = def_rat_sum(rat, rat_numer, rat_denom); + v rat_sub = def_rat_sub(rat, rat_numer, rat_denom); + v rat_equ = def_rat_equ(rat, rat_numer, rat_denom); + v number_a = el(rat, n(19), n(99)); + v number_b = el(rat, n(7), n(3)); + v absum = el(rat_sum, number_a, number_b); + v absub = el(rat_sub, number_a, number_b); + v are_equ = el(rat_equ, number_a, number_b); + printres(number_a, number_b, sum, sub, are_equ, numer, denom); + return 0; +} |