我可以复制具有*当前*状态的函数吗?

Can I copy a function with its *current* state?

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

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

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

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

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

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 的一些花哨的东西或我想不到的类似东西)?或者我只是要求做一些目前不可能的事情?

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

状态变量目前在运行时(通常是 MoarVM)一直向下处理,它们附加到字节码句柄。依次克隆 Block 会克隆底层字节码句柄,即 explicitly does not clone the state variables.