perl6 – 是否可以在Perl 6中使非编译时编译时代码?
假设我想在编译时创建许多类型,但在此之前让我们用一个更简单的例子来测试编译时代码:
# 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.如果要为变量赋值,它将完成工作. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |