aboutsummaryrefslogtreecommitdiff
path: root/examples/math.c
blob: df0aabc356a822307050bfd4927d1906ec1d7282 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
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;
}