perl6 – 使用Perl 6自定义运算符
发布时间:2020-12-15 23:34:17 所属栏目:大数据 来源:网络整理
导读:我正在大学学习化学,想尝试在Perl6或Perl中编写教科书示例,比如平衡化学式或其他过程! 然后我遇到的问题是关于perl6自定义运算符.当我使用该功能时,我觉得我一直在重复我的代码和我自己. 它很难读写.我该如何简化这个? #!/usr/bin/env perl6use v6;#basic
我正在大学学习化学,想尝试在Perl6或Perl中编写教科书示例,比如平衡化学式或其他过程!
然后我遇到的问题是关于perl6自定义运算符.当我使用该功能时,我觉得我一直在重复我的代码和我自己. #!/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); 解决方法
我在输入上声明类型替换了失败消息.这将让Perl 6担心数字是否输入并且如果不是则给出相应的错误消息.我还建立了所有长度和质量均为正的假设.
#!/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 within the range of pico to tera" } } } } class Mass does MetricPrefix { #basic Mass is g is different form si statda has $.g where * > 0; } class Length does MetricPrefix { has $.Length where * > 0; } # Mass multi postfix:<(kg)>( $input where * > 0) { return Mass.new( g => Mass.baSEOn("kilo",$input) ); } multi postfix:<(g)>( $input where * > 0) { return Mass.new( g => $input ); } multi infix:<+>( Mass $inputOne,Mass $inputTwo ) is assoc<right> { return Mass.new( g => $inputOne.g + $inputTwo.g); } multi infix:<->( Mass $inputOne,Mass $inputTwo ) is assoc<right> { return Mass.new( g => $inputOne.g - $inputTwo.g); } 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); } multi infix:</>( Mass $inputOne,Mass $inputTwo ) is assoc<right> is tighter( &infix:<+> ) is tighter( &infix:<-> ) { return Mass.new( g => $inputOne.g / $inputTwo.g); } #Length multi postfix:<(km)>( $input where * > 0) { return Length.new( Length => Length.baSEOn("kilo",$input) ); } multi postfix:<(m)>( $input where * > 0) { return Length.new( Length => $input ); } multi infix:<+>( Length $inputOne,Length $inputTwo ) is assoc<right> { return Length.new( Length => $inputOne.Length + $inputTwo.Length); } multi infix:<->( Length $inputOne,Length $inputTwo ) is assoc<right> { return Length.new( Length => $inputOne.Length - $inputTwo.Length); } 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); } multi infix:</>( Length $inputOne,Length $inputTwo ) is assoc<right> is tighter( &infix:<+> ) is tighter( &infix:<-> ) { return Length.new( Length => $inputOne.Length / $inputTwo.Length); } #just a test say 10(kg) + 1(g); say 10(m) + 1(m); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |