Module: generic-arithmetic-internal Author: Gary Palter 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 /// See the Integer proposal in Dylan Notebook\DylanWorks\Runtime\Integers\Integers ... /// This file simply defines a set of forwarding methods which may be enhanced /// by the Big-Integer library and/or other future generic libraries. /// In the Generic-Arithmetic library, arithmetic is still bounded /// just as it is in the Dylan library but, as other libraries are loaded, /// these bounds can change or be eliminated so we can't use constants. define variable $minimum-integer :: false-or() = dylan/$minimum-integer; define variable $maximum-integer :: false-or() = dylan/$maximum-integer; ///---*** Shouldn't we seal these generics over some domain (i.e., )? ///---*** However, we can't seal these generics without some mechanism to allow methods ///---*** to be added by other "system" libraries (i.e., Big-Integers, Ratios). define macro nary-logical-function-definer { define nary-logical-function ?:name } => { define sideways inline method "binary-" ## ?name (integer-1 :: , integer-2 :: ) => (value :: ) "dylan/" ## ?name(integer-1, integer-2) end method "binary-" ## ?name } end macro nary-logical-function-definer; define nary-logical-function logior; define nary-logical-function logxor; define nary-logical-function logand; define open generic lognot (x :: ) => (value :: ); define method lognot (x :: ) => (value :: ) dylan/lognot(x) end method lognot; define open generic logbit? (p :: dylan/, x :: ) => (value :: ); define method logbit? (p :: dylan/, x :: ) => (value :: ) dylan/logbit?(p, x) end method logbit?; define macro shift-function-definer { define shift-function ?:name ?domain:name } => { define open generic ?name (x :: , count :: dylan/) => (value :: ); define inline method ?name (x :: , count :: dylan/) => (value :: ) "dylan/" ## ?name(x, count) end method ?name } { define shift-function ?:name } => { define shift-function ?name } end macro shift-function-definer; define shift-function ash; define shift-function lsh; define macro algebraic-function-definer { define algebraic-function ?:name ?domain:name } => { define open generic ?name (integer-1 :: , integer-2 :: ) => (value :: ); define method ?name (integer-1 :: , integer-2 :: ) => (value :: ) "dylan/" ## ?name(integer-1, integer-2) end method ?name } { define algebraic-function ?:name } => { define algebraic-function ?name } end macro algebraic-function-definer; define algebraic-function lcm; define algebraic-function gcd;