gpt4 book ai didi

raku - 将标量绑定(bind)到无符号变量 (Perl 6)

转载 作者:行者123 更新时间:2023-12-04 14:22:43 24 4
gpt4 key购买 nike

首先让我说我理解我在标题中所问的是可疑的做法(如 here 所解释),但我缺乏理解涉及所涉及的语法。

当我第一次尝试将标量绑定(bind)到无符号符号时,我这样做了:

my \a = $(3);

认为 $(...)将 Int 3 打包成一个标量(如 documentation 中所建议的那样),然后将其绑定(bind)到符号 a。但这似乎不起作用:标量无处可寻( a.VAR.WHAT 返回 (Int),而不是 (Scalar))。

在上面引用的帖子中,raiph 提到可以使用不同的语法执行所需的绑定(bind):
my \a = $ = 3;

哪个有效。鉴于结果,我怀疑该语句可以等效地表达,尽管不太简洁,如: my \a = (my $ = 3) ,然后我就可以理解了。

这留下了一个问题:为什么尝试使用 $(...)不工作,而是做什么?

最佳答案

什么$(…)所做的是将一个值转换为 item .
(标量变量( $a )中的值也被标记为项目)

say flat (1,2,      (3,4)  );
# (1 2 3 4)

say flat (1,2, $((3,4)) );
# (1 2 (3 4))

say flat (1,2, item((3,4)) );
# (1 2 (3 4))

基本上它是为了防止值变平。它存在的原因是 Perl 6 不像大多数其他语言那样扁平化列表,有时您需要对扁平化进行更多控制。

以下唯一一种做你想做的事

my \a = $ = 3;

一个光秃秃的 $是匿名 state多变的。

my \a = (state $) = 3;

当您多次运行同一段代码时,问题就会出现。

sub foo ( $init ) {
my \a = $ = $init; # my \a = (state $) = $init;

(^10).map: {
sleep 0.1;
++a
}
}

.say for await (start foo(0)), (start foo(42));
# (43 44 45 46 47 48 49 50 51 52)
# (53 54 55 56 57 58 59 60 61 62)

# If foo(42) beat out foo(0) instead it would result in:
# (1 2 3 4 5 6 7 8 9 10)
# (11 12 13 14 15 16 17 18 19 20)

请注意,变量在调用之间共享。
第一个 Promise 停止在 sleep调用,然后第二个在第一次运行前设置状态变量 ++a .

如果您使用 my $相反,它现在可以正常工作。

sub foo ( $init ) {
my \a = my $ = $init;

(^10).map: {
sleep 0.1;
++a
}
}

.say for await (start foo(0)), (start foo(42));
# (1 2 3 4 5 6 7 8 9 10)
# (43 44 45 46 47 48 49 50 51 52)

问题是无符号的“变量”并不是真正的变量(它们不会变化),它们更类似于词法范围(非)常量。

constant \foo = (1..10).pick; # only pick one value and never change it

say foo;

for ^5 {
my \foo = (1..10).pick; # pick a new one each time through

say foo;
}

基本上,它们的全部意义在于尽可能接近您分配给它的值。 (Static Single Assignment)

# these work basically the same
-> \a {…}
-> \a is raw {…}
-> $a is raw {…}

# as do these
my \a = $i;
my \a := $i;
my $a := $i;

请注意,上面我写了以下内容:

my \a = (state $) = 3;

通常在状态变量的声明中,赋值只会在代码第一次运行时发生。裸 $没有这样的声明,所以我不得不通过将声明放在括号中来防止这种行为。

# bare $
for (5 ... 1) {
my \a = $ = $_; # set each time through the loop

say a *= 2; # 15 12 9 6 3
}

# state in parens
for (5 ... 1) {
my \a = (state $) = $_; # set each time through the loop

say a *= 2; # 15 12 9 6 3
}

# normal state declaration
for (5 ... 1) {
my \a = state $ = $_; # set it only on the first time through the loop

say a *= 2; # 15 45 135 405 1215
}

关于raku - 将标量绑定(bind)到无符号变量 (Perl 6),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51008959/

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