比方说,我想在编译时创建许多类型,但是在此之前,让我们先用一个更简单的示例测试编译时代码:
ggplot(Incidence_byweek, aes(x=DATE)) +
geom_line(aes(y=Incidence)) +
labs(title="Incidence trend", y="Incidence %")
以及直接原始库和最终用户文件之间的模块:
# 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 )
}
最终用户文件:
# in file middle.pm6
use root;
class A {} # Do something with stuff from root.pm6
然后在命令行中输入
:# in file user.pm6
use middle;
似乎对➜ tester perl6 -I. user.pm6
1
2
的第三次调用已被缓存,并且第三次没有执行。
这种行为使得foo
(以及其他编译时区域)中的任何相对复杂的计算(基于代码重用)都是不可能的。
根据我的理解,编译时代码应正常执行,其结果(例如某些声明,调整等)可由其他模块从编译单元访问。但是,还涉及某种缓存。
问题最终是具有可能里程碑的“如何实现我想要的”:
1)是否打算使用这种缓存?
2)如果是,可以在具有编译时代码执行优势的同时将其禁用吗?如果没有,还有其他解决方法吗?
更新1:更具体地解释我想要的东西:在编译时,我正在解析配置文件并创建要导出的类型。我希望这些是预先编译的,这就是重点。类型可以嵌套,并且可能有各种情况,因此我将过渡状态机模仿作为带有长sub EXPORT
语句的简单子例程来实现,某些分支是递归的(始终存在底部)。我坚持的问题是,一旦触发一次,某些分支将无法执行,这使我能够打入我在主要问题中提出的简单双given-where
通话。
更新2:如前文所述,当原始lib和用户-one之间的间接级别为0,但是当结构为foo 1
时,并不是所有代码都被执行。 / p>
答案 0 :(得分:4)
这似乎是Rakudo的bug或距离它足够近的东西。
至少,按照乔纳森·沃辛顿(Jonathan Worthington)的建议,使用note
代替say
可以使示例代码在必要时有效,从而清除了涉及可能的缓存的所有隐含含义。
答案 1 :(得分:3)
也许您正在使用INIT
移相器:
INIT {
# Things here may be a lot more complex
foo 1;
foo 2;
foo 1;
%( one => 1 )
}
对于您来说可能有些太冗长了:
> use user;
1
2
1
2
1
INIT
is run at runtime。如果要为变量分配值,它将完成工作。