Re: Re: Types in Mathematica
- To: mathgroup at smc.vnet.net
- Subject: [mg62779] Re: Re: Types in Mathematica
- From: "Steven T. Hatton" <hattons at globalsymmetry.com>
- Date: Mon, 5 Dec 2005 03:37:38 -0500 (EST)
- References: <200511191053.FAA16418@smc.vnet.net> <dlp2ci$le$1@smc.vnet.net> <200511200950.EAA04496@smc.vnet.net> <dls4vp$mmc$1@smc.vnet.net> <dm1ak3$i1n$1@smc.vnet.net> <dmjrb8$5u6$1@smc.vnet.net> <dmm2tp$nmo$1@smc.vnet.net> <200512031040.FAA06695@smc.vnet.net> <dmtbuu$fo6$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Kristen W Carlson wrote: > 5. If I am extending built-in or user-defined functions (like Plus), > should I restrict users to using a constructor to do that, or extend > the existing function in the context of my data type with an upvalue? I'm not sure what you mean here. Can you provide examples? > But below is an example that admittedly is borderline; altho I wrote > it as extending Part with an upvalue to extract the numerator or > denominator of a rational number (created as a new datatype as an > exercise from M220 the programming course), I can see the other point > of view--not allowing Part to do this. > .... > The datatype is rational[n_Integer, d_Integer] with n and d > type-checked as integers .... > > makeRational[n_Integer, 0] := > Print["This rational is undefined."] (* better than just getting > input back as output *) > > (* vs. this approach which Maeder wrote that does automatic type > conversion; for a negative denominator, it calls the function again > and just reverses the signs of the numerator and denominator; that way > negative rationals are always in the format rational[-n, d] *) > > makeRational[n_Integer, d_Integer?Negative] := makeRational[-n, d] > ... > denominator::"denominator will extract the denominator of the > rational. You can also use Part[ rational ] , which has been modified > to work correctly in the context of this package." > ... > rational /: (r_rational)[[1]] := numerator[r]; (* numerator is the > constructor *) > > rational /: (r_rational)[[2]] := denominator[r]; (* denominator is the > constructor *) Do you mean "selector" where you wrote "constructor" in the last two expressions? Thanks for posting that example. It was instructive. -- The Mathematica Wiki: http://www.mathematica-users.org/ Math for Comp Sci http://www.ifi.unizh.ch/math/bmwcs/master.html Math for the WWW: http://www.w3.org/Math/