gpt4 book ai didi

raku - 禁止无符号变量重新绑定(bind)是否有目的或好处?

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

试图更好地理解无符号变量以及它们与 $ 的区别标记变量,我发现,不像 $ sigiled 变量,sigiless 变量在初始化后不能被回弹:

my $a = 42;
my $b := $a;
$b := 42; # No exception generated

my \c := $a;
c := 42; # OUTPUT: «Cannot use bind operator with this left-hand side␤»

这是故意的吗?如果是这样,在 $ 时禁止无符号变量重新绑定(bind)是否有目的或好处?不禁止标记变量这样做吗?

最佳答案

是的,这当然是设计使然,而且 - 就像 Perl (6) 设计中的大多数事情一样 - 这样做的原因不止一个。

在讨论 sigilless 符号语法之前,值得花点时间记忆一下 sigil 在语言中扮演的一些角色。这些包括:

  • 语法消歧(您可以随意调用变量,即使恰好有一个具有该名称的关键字)
  • 可读性(程序中的数据因 sigil 而突出)
  • 定义赋值语义(在 Perl 6 中赋值意味着“复制到”,因此 my @a = @b 意味着迭代 @b 并将其中的每个东西放入 @a ,因此任何 future 对 @b 的赋值都不会影响 @a )_09x104567
  • 限制可以绑定(bind)的内容(例如,只有 Positional 的东西到 @ )
  • $ 的情况下,控制什么将被视为单个项目
  • 在签名参数上的 @ 的情况下,导致传入的 Seq 被缓存

  • 因此,每个 sigil 都携带一组有用的默认行为,用于将被视为单个项目的数据( $ )、位置索引的内容( @ )、使用键索引的内容( % )等等可以调用( & )。这些中的每一个,在赋值、低级绑定(bind)和签名绑定(bind)的上下文中,都为那种数据携带通常所需的语义。

    这很好,直到人们想要编写对所有这些行为都是多态的代码,或者不 promise 任何印记行为。 Perl 6 语言设计的早期迭代有类似 sub foo($x is parcel) { } 的东西,其中 is parcel 东西实际上意味着“不要在它上面强加任何类型的 sigil-y 语义”,除了这相当令人困惑,因为这东西有 $ sigil 但是选择退出语义。人们意识到,如果不应用印记行为,那么如果它看起来不同会更好(“不同的东西应该看起来不同”设计原则,这也在 Perl 中反复出现)。看起来与众不同的最明显方式是……没有印记。

    然而,出于语法原因,签名中需要一些东西来消除从类型引入的名称的歧义(因为像 (Foo) 这样的签名匹配类型 Foo 但忽略值已经被支持,并且很有用,我们不想要失去那个)。 \ 被选中来扮演这个角色,得到 sub foo(\x) { } ,然后允许在子程序内部使用 x

    我记得在 my 的情况下允许使用这种形式是稍后出现的,尽管我对此并不完全确定。关于不 promise 行为的无符号符号的重要事情之一是它也不 promise 分配行为,因此其上的 = 更晚一些(编译器在可能的情况下考虑符号,并发出 $/ &@/ % 分配的代码完全不同)。当然,如果符号绑定(bind)到一个值,则不可能进行赋值。

    这就留下了约束行为的问题。如其他答案之一所述,决定使无符号符号形成“静态单一分配”语法。这有多种原因,包括:
  • 帮助保持印记的“数据突出”可读性属性,至少确保任何(立即)可变的东西仍然带有印记
  • 还通过一种形式让读者知道符号永远不会反弹到新值来提高程序可读性,因此人们可以有效地将其视为在范围内不变。这与在没有符号的情况下很容易声明真正的 constant 是一致的。
  • 温和地鼓励更实用的风格(也许是通过让那些决定讨厌印记的人用至少比印记提供的方式更具可读性的代码返回我们其他人:-))

  • 最后,我会注意到我发现术语“无符号变量”有点误导,因为它没有任何变量。这是一种引入符号的语法,该符号被初始化绑定(bind)到特定事物,并且始终适用于该符号的(词法)生命周期。考虑它们的最佳方式可能是将它们与变量(意味着存储)区分开来,而只是将它们视为将名称附加到值的一种方式。

    关于raku - 禁止无符号变量重新绑定(bind)是否有目的或好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50399784/

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