是否可以使编译时代码不缓存在Perl 6中?

时间:2019-01-06 21:54:00

标签: perl6

比方说,我想在编译时创建许多类型,但是在此之前,让我们先用一个更简单的示例测试编译时代码:

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>

2 个答案:

答案 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。如果要为变量分配值,它将完成工作。