【问题标题】:Can I copy a function with its *current* state?我可以复制具有 *current* 状态的函数吗?
【发布时间】:2021-11-26 00:26:32
【问题描述】:

Raku 的state declarator 可用于为子例程或其他块提供其自己的本地状态,该状态在函数的多次调用中持续存在:

sub f { state $n++ }
say f; # OUTPUT: «0»
say f; # OUTPUT: «1»
say f; # OUTPUT: «2»

我知道“复制”具有内部状态的函数的两种方法:首先,我可以将其分配给一个新的 &-sigiled 变量,其代码类似于 my &f1 = &f。这导致&f1 实际上是&f 的别名,这意味着它们共享状态——任何改变&f&f1 状态的东西也会改变另一个函数的状态。

其次,我可以使用my &f2 = &f.clone 之类的代码创建&fclone。这将创建一个独立函数,其状态初始化为 &f 中的任何默认值(即,对于上面的代码,$nAny)。

但是,我正在寻找第三种复制 &f 的方法(如选项 1)将保留 &f 状态的当前值,但(如选项 2)将使该状态独立于 @ 987654338@的。换句话说,我希望能够使用下面被注释掉的行:

sub f { state $n++ }
say f; # OUTPUT: «0»
say f; # OUTPUT: «1»
say f; # OUTPUT: «2»
my &f1 = &f;
my &f2 = &f.clone;
# my &f3 = ???;
say f; # OUTPUT: «3»
say f; # OUTPUT: «4»
say f1; # OUTPUT: «5»
say f2; # OUTPUT: «0»
# say f3; # (desired) OUTPUT: «3»

有没有办法像这样保存&f 的状态(可能有一些我想不到的wrap 或类似的东西)?还是我只是要求做一些目前不可能的事情?

【问题讨论】:

    标签: state metaprogramming raku continuations rakudo


    【解决方案1】:

    不,没有办法 - 即使有人愿意编写一个依赖于不受支持的 Rakudo 内部结构的模块。

    状态变量目前在运行时(通常是 MoarVM)中一直被处理,它们被附加到字节码句柄。克隆Block 反过来克隆底层字节码句柄,explicitly does not clone the state variables

    【讨论】:

      猜你喜欢
      • 2014-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-04
      • 1970-01-01
      • 2012-04-23
      • 2020-09-17
      • 1970-01-01
      相关资源
      最近更新 更多