Perl 6'^ ='运算符不会产生结果,导致程序永远不会终止

mad*_*mma 10 perl6 raku

使用^=运算符时,程序永远不会终止,也不会产生结果.难道我做错了什么?

为了检查我是否可以重现这个,我使用了这个可工作的,可验证的例子:

my $k = 1;
$k ^= 24;
say $k;
Run Code Online (Sandbox Code Playgroud)

除此之外,我甚至尝试过:$k = $k ^ 24;- 但这仍然会产生同样的问题.

Bra*_*ert 8

其中有几个中缀运算符^,所有这些运算符都表示独占或以某种形式.

  • ^正义xor,如果只有一个值是真实的话,这是真实的.这是一个可以传递的价值.

    so     1 == 1 ^ 2; # True
    so     2 == 1 ^ 2; # True
    so    42 == 1 ^ 2; # False
    so 1 ^ 2 == 1 ^ 2; # False
    
    my $v = 1 ^ 2;
    so 1 == $v; # True
    
    Run Code Online (Sandbox Code Playgroud)

    我添加so了崩溃交叉点,你应该尽快做到这一点.

  • ^^短路xor.返回唯一的值.如果没有任何值,则返回最后一个值.如果存在多个真值,则会短路并返回Nil

    say ( 0 ^^ 42 ^^ Nil );
    42
    
    say ( !say(1) ^^ !say(2) ^^ -1 but False );
    1
    2
    -1
    
    say ( say(1) ^^ say(2) ^^ say(3) );
    1
    2
    Nil
    
    Run Code Online (Sandbox Code Playgroud)
  • +^Int按位xor.它比较了两个Ints的位,它返回的值有一个1Ints中只有一个I 1在该位置

    say (0b10101010 +^ 0b10100000).base: 2; # 1010
    
    say 1.5 +^ 2; # 3
    
    Run Code Online (Sandbox Code Playgroud)
  • ~^字符串按位xor.与+^字符串上的除外相同.

    say 'aa' ~^ 'US'; # 42
    
    Run Code Online (Sandbox Code Playgroud)

Perl 5用于^两者+^~^取决于它给出的值.如果您选择使用它们,则较新版本具有单独的运算符.


您的代码没有停止的原因是创建的Junction ^跟踪值的来源.

my $k = 1;
my $v = $k ^ 24;
say $v; # one(1, 24);

$k = 2;
say $v; # one(2, 24);
Run Code Online (Sandbox Code Playgroud)

那么就$k ^= 24创造了一种自我指涉的价值.这很好,直到你尝试使用或打印它.


mad*_*mma 6

正如@melpomene所建议的那样,我应该使用中+^运算符,即Integer按位异或运算符.

使用<op>=可读性语法,解决方案是:

my $k = 1;
$k +^= 24;
say $k
Run Code Online (Sandbox Code Playgroud)

^与大多数其他语言不同,普通中缀运算符用于其他内容.其中的运营商^包括:

  • 前缀+^做整数按位否定 ;

  • Infix^^执行短路布尔异或;

  • 前缀^是一个范围构造函数;

  • Infix^是一个"一个"连接构造函数(这是我的问题中的代码所调用的).