Can someone give a little more background why a unit conversion library needs a parser?
Like an ELI5 for someone not into neither Perl or Raku and haven’t met the units library before.
Like an ELI5 for someone not into neither Perl or Raku and haven’t met the units library before.
Mainly because you can add things to the existing parser instead. (See postfix and infix below.)
role Physics::Datum {
has Real $.value is required;
}
role Physics::Distance {
also does Physics::Datum;
}
role Physics::Volume {
also does Physics::Datum;
}
class Physics::Volume::Gallon {
also does Physics::Volume;
}
class Physics::Distance::Mile {
also does Physics::Distance;
}
role Physics::Per[ ::N-Type, ::D-Type ] {
has N-Type $.nu is required;
has D-Type $.de is required;
# could have a submethod TWEAK to reduce the fraction
}
constant gallon = Physics::Volume::Gallon.new( value => 1 );
sub postfix:<miles> ( Real $value ){
Physics::Distance::Meter.new( :$value )
}
sub infix:<per> ( ::NT Physics::Datum $nu, ::DT Physics::Datum $de ){
Physics::Per[NT,DT].new( :$nu, :$de )
}
my $mpg = 5miles per gallon;
Which would result in the following data structure. Physics::Per[ Physics::Distance::Mile, Physics::Volume::Gallon ].new(
nu => Physics::Distance::Mile.new( value => 5 ),
de => Physics::Volume::Gallon.new( value => 1 ),
)
I think the main reason it was written that way was it was copied from Perl.
A lot of the above would be more difficult or slower in Perl.(This was mostly a quick throwaway example of how it could be done.)
weight = unit("10 kg")
speed = unit("2.5 furlong per week") Unit(float, unit_as_string)
The free text version is pretty cool thoughFor example,
import week, custom, si, type from stdlib.units
weight = 10 * si.kg
speed = 2.5 * (custom("furlong", type.LENGTH) / week)