26 May 2005
This post may be outdated due to it was written on 2005. The links may be broken. The code may be not working anymore. Leave comments if needed.

Preface

junction, 中文可以翻译成结。强大得你会立刻爱上它。

Examples

先举几个例子:
  • 判断 $a 要么等于 1 要么等于 2 要么等于 3 ....
    # Perl 5
    if ($a == 1 || $a == 2 || $a == 3 || ....) {
    # Perl 6
    if $a = 1|2|3|.. {
  • 判断 $a $b 都不等于 $c $d (两个用 Perl 5 写还不算麻烦,但十个呢?)
    # Perl 5
    if ($a != $c) && ($a != $d) && ($b != $c) && ($b != $d) {
    # Perl 6
    if all($a, $b) == none($c, $d) {
  • 判断一个文件存在,然后大小不为零,可读可写(这个不是 junction)
    # Perl 5
    if (-e $_ && -s $_ && -r $_ && -w $_) {
    # Perl 6
    if -e -s -r -w $_ {
  • 判断数组 @a 中的任意元素都不在 @b 中(不是说 Perl 5 中无法实现,要用 %hash 来曲线救国),Perl 6 中用 junction 就很简单:
    if any(@a) ne any(@b) {
  • 判断数组 @a 中只有一个元素在 @b 中:(听起来非常像集合的运算,并,交,补,包含等)
    if one(@a) eq one(@b) {
  • 一个变量不是对象 A 也不是对象 B 也不是对象 C,或定义一个变量不是 Dog 就是 Cat.
    if $a ~~ none(A|B|C) {
    my Dog|Cat $pet;

详细描述

junction 其实是将一些数据值叠加,表现为一个数据值。junction 有四种形式:

列表操作符中缀(infix)操作符关系简单解释
all&AND所有的值必须都为 true
any|OR至少有一个值为 true
one^XOR有且仅有一个值为 true
noneNOT所有的值都得为 flase

注意中缀操作符是列表相关("list-associative")的:

$a | $b | $c 与 any($a,$b,$c) 同,而不是 any(any($a,$b),$c)
$a & $b & $c 与 all($a,$b,$c) 同,而不是 all(all($a,$b),$c)
$a ^ $b ^ $c 与 one($a,$b,$c) 同,而不是 one(one($a,$b),$c)

junction 与 向量操作符 有点类似。不同的是 junction 大多运行在判断正确与否里。

我们还是用例子来说明 junction 的运算:
$junc = any(1, 2);
$junc += 5; # $junc is now any(6, 7)
    junction 方法:
  • 我们用 .values 将 junction 展平为列表:(这种情况下或许向量操作符看起来更清晰点)
    my $junc = all(1, 2, 3);    # create a junction
    my $sums = $junc + 3;       # add 3
    my @set  = $sums.values();  # (4, 5, 6)
  • 我们用 dump 来输出某一 junction 的结构:
    $string = $sums.dump( ); # $string = "all(4,5,6)"
  • pick 只能从 any 或只有一个值的 one 里取得随机值,对于 all, none 和多于一个值的 one, 返回 undef
    my $junc = any(1, 2, 3);
    say $junc.pick();  # may be 1, 2, or 3
    
    my $junc = all(1, 2, 3); # none is the same as all
    say $junc.pick();  # undef
    
    my $junc = one(1, 2, 3);
    say $junc.pick();  # undef
    
    my $junc = one(1);
    say $junc.pick();  # 1

use junction;

have fun, guys.


blog comments powered by Disqus