NB. Definitions for Laboratory Experiment 7 NB. Rational Arithmetic Operations plus_rat =: dyad def '(((num x.) * den y.) + (num y.) * den x.) make_rat (den x.) * den y.' minus_rat =: dyad def '(((num x.) * den y.) - (num y.) * den x.) make_rat (den x.) * den y.' times_rat =: dyad def '((num x.) * num y.) make_rat (den x.) * den y.' divide_rat =: dyad def '((num x.) * den y.) make_rat (den x.) * num y.' equal_rat =: dyad def '((num x.) * den y.) = (num y.) * den x.' print_rat =: monad define if. 1 = denum =. den y. do. format num y. else. (format num y.) , '%' , format denum end. ) NB. Constructor (Remove common factors at construction time) make_rat =: dyad def '(x. % g) link (y. % g =. x. gcd y.) link ''rat''' NB. Accessors num =: open atop (0 bond from) den =: open atop (1 bond from) NB. Predicates fractionp =: monad define if. 3 = tally y. do. if. 'rat' match open 2 from y. do. 1 else. 0 end. else. 0 end. ) NB. Addition with type conversion plus =: dyad define if. (fractionp x.) and fractionp y. do. x. plus_rat y. elseif. (fractionp x.) and numberp y. do. ((num x.) % den x.) + y. elseif. (numberp x.) and fractionp y. do. x. + (num y.) % den y. elseif. (numberp x.) and numberp y. do. x. + y. elseif. 1 do. error 'wrong type input to plus' end. )