加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl6 – 是否可以在Perl 6中使非编译时编译时代码?

发布时间:2020-12-16 06:21:45 所属栏目:大数据 来源:网络整理
导读:假设我想在编译时创建许多类型,但在此之前让我们用一个更简单的例子来测试编译时代码: # in file root.pm6sub foo($a) { $a.say }sub EXPORT { # Things here may be a lot more complex foo 1; foo 2; foo 1; %( one = 1 )} 以及直接原始库和最终用户文件
假设我想在编译时创建许多类型,但在此之前让我们用一个更简单的例子来测试编译时代码:

# 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.如果要为变量赋值,它将完成工作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读