假设我想在编译时创建许多类型,但在此之前让我们用一个更简单的例子来测试编译时代码:
# 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被缓存,并且第三次没有被执行.
这种行为使得子EXPORT(以及其他编译时区域)中的任何相对复杂的计算(基于代码重用)都是不可能的.
根据我的理解,编译时代码意味着正常执行,其结果(例如一些声明,调整等)可由其他模块从编译单元访问.但是,也存在某种缓存.
问题是,最终,“如何实现我想要的”可能的里程碑:
1)是否有这种缓存?
2)如果是,可以在编译时代码执行的优势下禁用吗?如果不是,还有哪些可行的解决方法?
更新1:解释我想要更具体的事情:在编译时我正在解析配置文件并创建要导出的类型.我希望那些是预先编译的,这就是重点.类型可以嵌套,各种情况都是可能的,所以我提交了一个过渡状态机模仿实现为一个简单的子程序,带有一个长的给定语句,一些分支是递归的(底部总是存在).我坚持的问题是一些分支在被解雇后不会被执行,我能够在主要问题中提出简单的双foo 1呼叫.
更新2:正如raiph所提到的,当原始lib和user-one之间的间接性级别为0时,从命令行运行时它正常工作,但是当结构是创建类型的root lib文件时 – >修补那些的中间件lib文件 – >最终用户(无论是测试文件还是其他模块,都不是所有代码都被执行.
解决方法
也许你正在看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.如果要为变量赋值,它将完成工作.