例如,我有这样的代码:
class Foo {}
class Bar is Foo {}
Run Code Online (Sandbox Code Playgroud)
虽然这个行动的用处是有争议的,但是有可能禁止继承Foo吗?
假设我想在编译时创建许多类型,但是在此之前,让我们用一个更简单的示例测试编译时代码:
# in file root.pm6
sub foo($a) { $a.say }
sub EXPORT {
# Things here may be a lot more complex
foo 1;
foo 2;
foo 1;
%( one => 1 )
}
Run Code Online (Sandbox Code Playgroud)
以及直接原始库和最终用户文件之间的模块:
# in file middle.pm6
use root;
class A {} # Do something with stuff from root.pm6
Run Code Online (Sandbox Code Playgroud)
最终用户文件:
# in file user.pm6
use middle;
Run Code Online (Sandbox Code Playgroud)
然后在命令行中:
? tester perl6 -I. user.pm6
1
2
Run Code Online (Sandbox Code Playgroud)
似乎第三次调用foo已被缓存,并且没有第三次执行。
这种行为使得sub EXPORT(以及在其他编译时区域)进行任何相对复杂的计算(基于代码重用)成为不可能。
根据我的理解,编译时代码应正常执行,其结果(例如某些声明,调整等)可由其他模块从编译单元访问。但是,也涉及某种缓存。
问题最终是具有可能里程碑的“如何实现我想要的”:
1)是否打算使用这种缓存?
2)如果是,可以在具有编译时代码执行优势的同时将其禁用吗?如果没有,还有其他解决方法吗?
更新1:更具体地解释我想要的事情:在编译时,我正在解析配置文件并创建要导出的类型。我希望这些是预先编译的,这就是重点。类型可以嵌套,并且可能有各种情况,因此我将过渡状态机模拟作为带有长given-where语句的简单子例程来实现,某些分支是递归的(底部始终存在)。我坚持的问题是,一旦触发一次,某些分支将无法执行,这使我能够打入 …
根据文档,类的Bool方法Regex...
与调用者的$ _变量匹配,对于匹配项返回True,对于不匹配项返回False。
但是,在这个例子中
$_ = "3";
my regex decimal { \d };
say &decimal.Bool;
Run Code Online (Sandbox Code Playgroud)
返回False。另外,查看源代码,它说的还算合理,因为它将匹配$!topic实例变量。但是,尚不清楚此变量将有效地对应于$ _,并且上面的示例似乎是这样说的。任何实际发生的想法?