cod*_*ons 8 continuations state metaprogramming rakudo raku
Raku 的状态声明符可用于为子例程或其他块提供其自己的本地状态,该状态在函数的多次调用中持续存在:
\nsub f { state $n++ }\nsay f; # OUTPUT: \xc2\xab0\xc2\xbb\nsay f; # OUTPUT: \xc2\xab1\xc2\xbb\nsay f; # OUTPUT: \xc2\xab2\xc2\xbb\nRun Code Online (Sandbox Code Playgroud)\n我知道有两种“复制”具有内部状态的函数的方法:首先,我可以使用&诸如my &f1 = &f. 这导致&f1有效地成为别名,&f并且意味着它们共享状态 \xe2\x80\x93 任何改变其他函数状态&f或&f1也将改变其他函数状态的东西。
其次,我可以使用像&f. my &f2 = &f.clone这将创建一个独立的函数,其状态被初始化为任何默认值(&f即上面的代码)。$nAny
然而,我希望采用第三种复制方法&f(如选项 1)将保留 \ 状态的当前值&f,但(如选项 2)将使该状态独立于&f\ 的状态。换句话说,我希望能够使用下面注释掉的行:
sub f { state $n++ }\nsay f; # OUTPUT: \xc2\xab0\xc2\xbb\nsay f; # OUTPUT: \xc2\xab1\xc2\xbb\nsay f; # OUTPUT: \xc2\xab2\xc2\xbb\nmy &f1 = &f;\nmy &f2 = &f.clone;\n# my &f3 = ???;\nsay f; # OUTPUT: \xc2\xab3\xc2\xbb\nsay f; # OUTPUT: \xc2\xab4\xc2\xbb\nsay f1; # OUTPUT: \xc2\xab5\xc2\xbb\nsay f2; # OUTPUT: \xc2\xab0\xc2\xbb\n# say f3; # (desired) OUTPUT: \xc2\xab3\xc2\xbb\nRun Code Online (Sandbox Code Playgroud)\n有什么方法可以保存&f这样的状态(也许用一些我想不到的奇特的包装或类似的东西)?或者我只是要求做一些目前不可能的事情?
不,没有办法——即使有人愿意编写一个依赖于不受支持的 Rakudo 内部结构的模块也是如此。
状态变量目前在运行时(通常是 MoarVM)中一直处理,它们附加到字节码句柄。克隆 aBlock会依次克隆底层字节码句柄,但显式不会克隆状态变量。