On Tue, Dec 04, 2007 at 07:39:16AM -0800, Larry Wall wrote:
> On Sun, Oct 07, 2007 at 03:01:06PM -0600, David Green wrote:
> > What happened to the suggestion of using ` to designate units?
> 
> It's kinda caught between two other notions.  On the one hand,
> we're trying to reserve ` for user definition, in part because it's
> so difficult to tell from ' in many fonts so we're avoiding it for
> standard usage.  On the other hand, it's not clear that units aren't
> generally just simple multiplication by a scaling factor: 1*in, where
> 1*in == 2.54*cm, for instance.  Units could also be viewed as type
> conversion, which would give us kg(1) and 1.kg as conversion forms
> in current Perl 6.  Since 1.kg is essentially using the units as a
> postfix, presumably the 1kg form could also work on literals, just as
> we currently allow 1i to convert 1 to i via the postfix:<i> operator.
> (And I suppose there's a sense in which 10e-2 is specifying the
> scaling factor of the left side explicitly.)
> 
> In any case, though, if we treated them as type names rather than
> just methods, we'd probably want to require predeclaration of unit
> names since a type name like "kg" or "in" or "fortnight" could easily
> collide with a user-defined routine.  Or maybe they still want some
> special sigil-ish mark to stay in their own namespace.  Dunno.  I don't
> think we have to solve that for 6.0.0 in any case, especially if we
> require predeclaration of which unit names are wanted, in which case
> there might just be a units pragma that can pull in selections of
> the predefined units:
> 
>     use units :cgs, :nasa, <μfortnight gibibyte>;
>     my newton $thrust = 42.lbf;
> 
> But with a sigilish mark we could just pull in all the units from
> /usr/share/units.dat, I suppose.

I don't know if I ever mentioned it on the mailing list, but a while
back I did some work on a units module that uses units.dat
(examples/rules/unitsdat-grammar.pm in the pugs repo).  I think
that a simple postfix syntax (e.g.) doesn't give you the ability to
specify the kind of composite units that are common in scientific
applications where units are heavily used (e.g. Gauss per square root
Hertz).  Those kind of units also rule out simple type-based units, e.g.
having roles for length, mass, etc. - you can't do a role to the -7/3
power.  I settled on a syntax that allows a mini-language similar to
units(1):

9.8.:as<m / s ** 2>
$field_noise.:as<gauss / sqrt(Hz)>

But someone may be able to come up with something better.  My
implementation does unit type-checking at runtime, but compile-time
checking would be much nicer where possible.  It would also be cool to
be able to define roles that can represent themselves in several
different units:

role Photon does NumUnit { ??? }
my Photon $p .=new( energy => 42.:as<eV> );
say "energy is $p.:as<zJ> zeptojoules";
say "wavelength is $p.:as<angstrom> Å";
say "frequency is $p.:as<THz> THz";

-ryan

Reply via email to