Ich studiere Chemie in der Universität und möchte versuchen, Lehrbuch Beispiele in Perl6 oder Perl, wie Ausgleich der chemischen Formel oder andere Prozesse!Verwendung von Perl 6 benutzerdefinierte Operatoren
Dann stieß ich auf das Problem ist perl6 benutzerdefinierte Betreiber. Ich fühle, dass ich meinen Code und mich selbst wiederholt habe, wenn ich das Feature nutze. Es ist schwer zu lesen und zu schreiben. Wie kann ich das vereinfachen?
#!/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 Must 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 fail "you Must input a number";
}
multi postfix:<(m)>($input) {
return Length.new(Length => $input) or fail "you Must input a number";
}
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);
Dies fühlt sich eher nach einer Code Review-Frage an als nach einem Problem, das Sie lösen müssen. Sie * könnten * (und überprüfen Sie zuerst ihre Hilfe) finden Sie eine bessere Passform auf unserer Schwester-Website https://codereview.stackexchange.com – IMSoP
die 'submethod BUILD's sind unnötig, weil Sie die Attribute als öffentlich deklariert. –
ja, Diese Submethode BUILD ist unnötig, wenn ich keine Objektkonstruktion verwendet habe; –