Вы можете создать комбинированное значение и использовать подпись как when
условное.
(:(…)
- синтаксис для литерала подписи.)
given ($foo,$bar,$baz) {
when :( Any:D, Any:D, Any:D ) { 'all defined' }
when :( Any:D, Any:D, Any:U ) { '$baz undefined' }
when :( Any:D, Any:_, Any:D ) { '$bar not checked' }
default { … }
}
Вы могли создайте лексические константы, чтобы сделать его короче.
my constant D = Any:D; # defined
my constant U = Any:U; # undefined
my constant _ = Any:_; # either
given ($foo,$bar,$baz) {
when :(D,D,D) { 'all defined' }
when :(D,D,U) { '$baz undefined' }
when :(D,_,D) { '$bar not checked' }
default { … }
}
Или, если вы хотите, чтобы он был более наглядным:
my constant term:<▣> = Any:D; # defined
my constant term:<□> = Any:U; # undefined
my constant term:<▨> = Any:_; # either
given ($foo,$bar,$baz) {
when :(▣,▣,▣) { 'all defined' }
when :(▣,▣,□) { '$baz undefined' }
when :(▣,▨,▣) { '$bar not checked' }
default { … }
}
Вы можете создать подпрограмму, которая дает подпрограмму для использования вместо нее.
## something like this should work
## but something is weird with the returns constraint
#sub prefix:<d> ( $_ ) {
# my constant %lookup = (
# '▣' => Parameter.new( type => Any:D ),
# '□' => Parameter.new( type => Any:U ),
# '▨' => Parameter.new( type => Any:_ ),
# );
# Signature.new: params => %lookup{.comb}
#}
sub prefix:<d> ( $_ ) {
my constant %lookup = (
'▣' => 'Any:D',
'□' => 'Any:U',
'▨' => 'Any:_',
);
use MONKEY-SEE-NO-EVAL;
EVAL ":(%lookup{.comb}.join(","))"
}
given ($foo,$bar,$baz) {
when d'▣▣▣' { 'all defined' }
when d'▣▣□' { '$baz undefined' }
when d'▣▨▣' { '$bar not checked' }
default { … }
}