```⍝ Rational number arithmetic:

28 rats 75                              ⍝ rational representation.
2 7  3  5
2 1 ¯1 ¯2

rexp←{⍺←'r'                         ⍝ simple r-expression translator.
rat←{')',⍵,'rats('}             ⍝ '-' → ')-rats('
svec←rat\¨2/¨'+-×÷*∧^∨⍎⍕'       ⍝ subs pair for each op fn.
src←↑subs/(svec,⊂⍺'rats '),⊂⍵   ⍝ translated source. See →subs←.
'(',src,')'                     ⍝ source for apl expression.
}

eval ← ⍕rats∘⍎∘rexp                     ⍝ r-expression evaluator.

eval '36r140'                           ⍝ simplify.
9r35
eval¨'0r1' '1r1'                        ⍝ tricky cases.
┌───┬───┐
│0r1│1r1│
└───┴───┘
eval '1r1 - 0r1'                        ⍝ tricky case.
1r1
eval '0r1 + 1r1'                        ⍝ tricky case.
1r1
eval '0r1 - 0r1'                        ⍝ tricky case.
0r1
eval '1r2 + 1r3'                        ⍝ + sum
5r6
eval '1r2 - 1r3'                        ⍝ - diff
1r6
eval '3r4 × 2r3'                        ⍝ × prod
1r2
eval '2r3 ÷ 2r3'                        ⍝ ÷ quot
1r1
eval '4r9 * 3r2'                        ⍝ * power
8r27
eval '3r5 ∧ 5r6'                        ⍝ ∧ lcm
15r1
eval '3r5 ∨ 5r6'                        ⍝ ∨ gcd
1r30
eval '(1r2 × 3r4) + 1r8'                ⍝ more complex expression.
1r2
eval '3r1 - 5r1'                        ⍝ subtraction of larger from smaller
11::negative
eval '0r1 - 5r1'                        ⍝ subtraction of larger from zero.
11::negative

⍎rats 3 rats 4                          ⍝ real equivalent.
0.75
{⍵ ?rats ⍵} 3 rats 4                    ⍝ unexpected operand function.
11::unexpected: ?

eval '2r1 * 1r2'                        ⍝ 2*÷2 irrational power.
11::irrational

(0 rats 0)(0rats 1)(1 rats 1)           ⍝ tricky cases
┌─┬─┬┐
│0│0││
│1│1││
└─┴─┴┘

tab←{                       ⍝ function table
aa←⍺⍺{                  ⍝ test function.
11::'*'             ⍝ * for error.
⍺ ⍺⍺ rats ⍵         ⍝ apply rats operand.
}                       ⍝
r←{⍺ rats ⍵}            ⍝ ⍺/⍵ matrix.
f←⍎rats                 ⍝ float.
rat← ∘.aa ⍨ ∘.r ⍨ ⍳⍵    ⍝ using ⍺⍺ rats.
alt← ∘.⍵⍵ ⍨ ∘.÷ ⍨ ⍳⍵    ⍝ using ⍵⍵ alternative.
alt ≡ f¨ rat            ⍝ results identical?
}

+tab+       5                           ⍝ + sum
1
-tab{⍺<⍵:'*' ⋄ ⍺-⍵} 5                   ⍝ - diff
1
×tab×       5                           ⍝ × prod
1
÷tab÷       5                           ⍝ ÷ quot
1
⎕ct←16*¯8                               ⍝ soften tolerance for gcd/lcm:

∨tab∨       5                           ⍝ ∨ gcd
1
∧tab∧       5                           ⍝ ∧ lcm
1

Back to: code

Back to: Workspaces
```