gpt4 book ai didi

raku - 使用 Perl 6 自定义运算符

转载 作者:行者123 更新时间:2023-12-04 20:02:38 25 4
gpt4 key购买 nike

我在大学学习化学,想尝试用 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);

关于raku - 使用 Perl 6 自定义运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43070758/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com