Malcolm McLean wrote:
On Sep 27, 9:29 pm, p...@informatimago.com (Pascal J. Bourguignon)
wrote:
On the other hand, with the dynamic typing mindset, you might even wrap
your values (of whatever numerical type) in a symbolic expression
mentionning the unit and perhaps other meta data, so that when the other
module receives it, it may notice (dynamically) that two values are not
of the same unit, but if compatible, it could (dynamically) convert into
the expected unit.  Mission saved!

I'd like to design a language like this. If you add a quantity in
inches to a quantity in centimetres you get a quantity in (say)
metres. If you multiply them together you get an area, if you divide
them you get a dimeionless scalar. If you divide a quantity in metres
by a quantity in seconds you get a velocity, if you try to subtract
them you get an error.

There are already numerous libraries that help you with this kind of things in various languages; Python (you're crossposting to comp.lang.python), for instance, has several, such as Unum, and including one I've written but not yet released. It's not clear why one would need this built into the language:

>>> print si
kg m s A K cd mol
>>> length = 3*si.in_ # underscore is needed since `in` is a keyword
>>> print length
3.0 in_
>>> lengthInCentimeters = length.convert(si.cm)
>>> print lengthInCentimeters
7.62 cm
>>> area = lengthInCentimeters*lengthInCentimeters
>>> print area
58.0644 cm**2
>>> biggerArea = 10.0*area
>>> ratio = area/biggerArea
>>> print ratio
0.1
>>> speed = (3.0*si.m)/(1.5*si.s)
>>> print speed
2.0 m/s
>>> ratio - speed
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "unity.py", line 218, in __sub__
    converted = other.convert(self.strip())
  File "unity.py", line 151, in convert
raise IncompatibleUnitsError, "%r and %r do not have compatible units" % (self, other) __main__.IncompatibleUnitsError: <Quantity @ 0x-4814a834 (2.0 m/s)> and <Quantity @ 0x-4814a7d4 (1.0)> do not have compatible units

And everybody's favorite:

>>> print ((epsilon_0*mu_0)**-0.5).simplify()
299792458.011 m/s
>>> print c # floating point accuracy aside
299792458.0 m/s

--
Erik Max Francis && m...@alcyone.com && http://www.alcyone.com/max/
 San Jose, CA, USA && 37 18 N 121 57 W && AIM/Y!M/Skype erikmaxfrancis
  In Heaven all the interesting people are missing.
   -- Friedrich Nietzsche
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to