Module: common-dylan-internals 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 ////////////////////////////////////////////////////////////////////////////// // %+ (x :: , y :: ) // => result :: , overflow? :: // // %- (x :: , y :: ) // => result :: , overflow? :: define macro simple-arithmetic-definer { define simple-arithmetic ?:name ?lowlevel:name } => { define sealed generic ?name (x :: , y :: ) => (result :: , overflow? :: ); define inline method ?name (x :: , y :: ) => (result :: , overflow? :: ); ?lowlevel(x, y); end method; define inline method ?name (x :: , y :: ) => (result :: , overflow? :: ); ?lowlevel(x, coerce-abstract-integer-to-machine-word(y)); end method; define inline method ?name (x :: , y :: ) => (result :: , overflow? :: ); ?lowlevel(coerce-abstract-integer-to-machine-word(x), y); end method; define inline method ?name (x :: , y :: ) => (result :: , overflow? :: ); ?lowlevel(coerce-abstract-integer-to-machine-word(x), coerce-abstract-integer-to-machine-word(y)); end method; } end macro; define simple-arithmetic \%+ machine-word-add-with-overflow; define simple-arithmetic \%- machine-word-subtract-with-overflow; ////////////////////////////////////////////////////////////////////////////// // %* (x :: , y :: ) // => low :: , high :: , overflow? :: define sealed generic \%* (x :: , y :: ) => (low :: , high :: , overflow? :: ); define inline method \%* (x :: , y :: ) => (low :: , high :: , overflow? :: ); machine-word-multiply-with-overflow(x, y); end method; define inline method \%* (x :: , y :: ) => (low :: , high :: , overflow? :: ); machine-word-multiply-with-overflow (x, coerce-abstract-integer-to-machine-word(y)); end method; define inline method \%* (x :: , y :: ) => (low :: , high :: , overflow? :: ); machine-word-multiply-with-overflow (coerce-abstract-integer-to-machine-word(x), y); end method; define inline method \%* (x :: , y :: ) => (low :: , high :: , overflow? :: ); machine-word-multiply-with-overflow (coerce-abstract-integer-to-machine-word(x), coerce-abstract-integer-to-machine-word(y)); end method; ////////////////////////////////////////////////////////////////////////////// // %negative(x :: ) // => result :: , overflow? :: // // %abs(x :: ) // => result :: , overflow? :: define macro sign-modifier-definer { define sign-modifier ?:name ?lowlevel:name } => { define sealed generic ?name (x :: ) => (result :: , overflow? :: ); define inline method ?name (x :: ) => (result :: , overflow? :: ); ?lowlevel(x); end method; define inline method ?name (x :: ) => (result :: , overflow? :: ); ?lowlevel(coerce-abstract-integer-to-machine-word(x)); end method; } end macro; define sign-modifier %negative machine-word-negative-with-overflow; define sign-modifier %abs machine-word-abs-with-overflow;