hi monk
I am studying chemistry in the university,
and then I try to write all the things in the textbook with Perl6 or Perl,
like balancing the chemical formula or other process!
Then I encountered the problem is on perl6 custom operator.
I feel I have been repeating my code and myself when i use the feature.
It is hard to read and write, and what is the way to deal with such problems?
#!/usr/bin/env perl6
use v6;
#basic SI(International System of Units) type
role MetricPrefix {
method baseOn ( Str $base , Numeric $input ) {
given $base {
when 'pico' { return $input * 10**-12 }
when 'namo' { return $input * 10**-9 }
when 'micro' { return $input * 10**-6}
when 'milli' { return $input * 10**-3 }
when 'centi' { return $input * 10**-2 }
when 'hecto' { return $input * 10**2 }
when 'kilo' { return $input * 10**3 }
when 'mega' { return $input * 10**6 }
when 'giga' { return $input * 10**9 }
when 'tera' { return $input * 10**12 }
default { fail "you must input a metric prefix which allow
+ pico to tera" }
}
}
}
class Mass does MetricPrefix {
#basic Mass is g is different form si statda
has $.g;
submethod BUILD ( :$!g ) {
}
}
class Length does MetricPrefix {
has $.Length ;
submethod BUILD ( :$!Length ) {
}
}
multi postfix:<(kg)>( $input ) {
return Mass.new( g => Mass.baseOn("kilo",$input) ) or fail "you Mu
+st input a number";
}
multi postfix:<(g)>( $input ) {
return Mass.new( g => $input ) or fail "you Must input a number";
}
multi infix:<+>( Mass $inputOne , Mass $inputTwo ) is assoc<right> {
return Mass.new( g => $inputOne.g + $inputTwo.g) or fail "error in
+ there ";
}
multi infix:<->( Mass $inputOne , Mass $inputTwo ) is assoc<right> {
return Mass.new( g => $inputOne.g - $inputTwo.g) or fail "error in
+ there ";
}
multi infix:<*>( Mass $inputOne , Mass $inputTwo ) is assoc<right> is
+tighter( &infix:<+> ) is tighter( &infix:<-> ) is tighter( &infix:</>
+) {
return Mass.new( g => $inputOne.g * $inputTwo.g) or fail "error in
+ there ";
}
multi infix:</>( Mass $inputOne , Mass $inputTwo ) is assoc<right> is
+tighter( &infix:<+> ) is tighter( &infix:<-> ) {
return Mass.new( g => $inputOne.g / $inputTwo.g) or fail "error in
+ there ";
}
#the meterLeng
multi postfix:<(km)>( $input ) {
return Length.new( Length => Length.baseOn("kilo",$input) ) or fai
+l "you Must input a number";
}
multi postfix:<(m)>( $input ) {
return Length.new( Length => $input ) or fail "you Must input a nu
+mber";
}
multi infix:<+>( Length $inputOne , Length $inputTwo ) is assoc<right>
+ {
return Length.new( Length => $inputOne.Length + $inputTwo.Length)
+or fail "error in there ";
}
multi infix:<->( Length $inputOne , Length $inputTwo ) is assoc<right>
+ {
return Length.new( Length => $inputOne.Length - $inputTwo.Length)
+or fail "error in there ";
}
multi infix:<*>( Length $inputOne , Length $inputTwo ) is assoc<right>
+ is tighter( &infix:<+> ) is tighter( &infix:<-> ) is tighter( &infix
+:</>) {
return Length.new( Length => $inputOne.Length * $inputTwo.Length)
+or fail "error in there ";
}
multi infix:</>( Length $inputOne , Length $inputTwo ) is assoc<right>
+ is tighter( &infix:<+> ) is tighter( &infix:<-> ) {
return Length.new( Length => $inputOne.Length / $inputTwo.Length)
+or fail "error in there ";
}
#just a test
say 10(kg) + 1(g);
say 10(m) + 1(m);
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.
|