module: ratio language: prefix-dylan author: Jonathan Bachrach Copyright: Original Code is Copyright (c) 1995-2004 Functional Objects, Inc. All rights reserved. License: Functional Objects Library Public License Version 1.0 Dual-license: GNU Lesser General Public License Warranty: Distributed WITHOUT WARRANTY OF ANY KIND (define-class () (numerator required-init-keyword: numerator: type: ) (denominator required-init-keyword: denominator: type: )) (define-method contagious-class ((x ) (y )) ) (define-method contagious-class ((x ) (y )) ) (define-method contagious-class ((x ) (y )) ) (define-method contagious-class ((x ) (y )) (object-class x)) (define-method contagious-class ((x ) (y )) (object-class y)) (define-method as ((class (singleton )) (ratio )) ratio) (define-method as ((class (singleton )) (float )) (as float)) (define-method as ((class (singleton )) (ratio )) (truncate/ (numerator ratio) (denominator ratio))) (define-method as ((class (singleton )) (ratio )) (/ (as (numerator ratio)) (as (denominator ratio)))) (define-method as ((class (singleton )) (ratio )) (as ratio)) (define-method make-ratio ((numerator ) (denominator )) (make numerator: numerator denominator: denominator)) (define-method make-ratio* ((numerator ) (denominator )) (canonicalize (make numerator: numerator denominator: denominator))) (define-method canonicalize ((number )) (bind (((the-gcd ) (gcd (numerator number) (denominator number)))) (unless (= the-gcd 1) (set! (numerator number) (truncate/ (numerator number) the-gcd)) (set! (denominator number) (truncate/ (denominator number) the-gcd))) (when (negative? (denominator number)) (set! (denominator number) (- (denominator number))) (set! (numerator number) (- (numerator number)))) (if (= (denominator number) 1) (numerator number) number))) (define-method as ((class (singleton )) (integer )) (make-ratio integer 1)) (define-method as ((class (singleton )) (float )) (rationalize-with-epsilon float (as (epsilon )))) (define-method as ((class (singleton )) (float )) (rationalize-with-epsilon float (epsilon (object-class float)))) (define-method id-hash ((object )) (values (merge-hash-ids (id-hash (numerator object)) (id-hash (denominator object)) ordered: #T) $permanent-hash-state)) (define-method integral? ((number )) #F) (define-method = ((number-1 ) (number-2 )) (and (= (numerator number-1) (numerator number-2)) (= (denominator number-1) (denominator number-2)))) (define-method < ((number-1 ) (number-2 )) (bind ((numerator-1 (* (numerator number-1) (denominator number-2))) (numerator-2 (* (numerator number-2) (denominator number-1)))) (< numerator-1 numerator-2))) (define-method + ((number-1 ) (number-2 )) (make-ratio* (+ (* (numerator number-1) (denominator number-2)) (* (numerator number-2) (denominator number-1))) (* (denominator number-1) (denominator number-2)))) (define-method * ((number-1 ) (number-2 )) (make-ratio* (* (numerator number-1) (numerator number-2)) (* (denominator number-1) (denominator number-2)))) (define-method - ((number-1 ) (number-2 )) (make-ratio* (- (* (numerator number-1) (denominator number-2)) (* (numerator number-2) (denominator number-1))) (* (denominator number-1) (denominator number-2)))) (define-method / ((number-1 ) (number-2 )) (make-ratio* (* (numerator number-1) (denominator number-2)) (* (denominator number-1) (numerator number-2)))) (define-method negative ((number )) (make-ratio* (- (numerator number)) (denominator number)))