gpt4 book ai didi

compilation - Raku 程序编译和执行的顺序(可能是嵌套编译阶段?)

转载 作者:行者123 更新时间:2023-12-04 11:09:17 25 4
gpt4 key购买 nike

以下程序无法正确编译:

sub f(Int $a) { my Str $b = $a }
say f 42;
say f 'foo';
具体来说,第 3 行导致编译错误(带有 ===SORRY!=== 错误消息);此错误发生在第 2 行执行之前,因此永远不会达到 &f 中的类型不匹配。
但是,具体是什么时候发生此错误?我认为它发生在 CHECK phase ,但惊讶地发现 raku -c不会产生编译错误;它报告 Syntax OK .
为了更深入地研究这一点,我在上面的代码片段中添加了日志记录代码:
BEGIN note 'begin';
CHECK note 'check';
INIT note 'init';
END note 'end';

sub f(Int $a) { my Str $b = $a }
say f 42;
say f 'foo';
使用 raku -c 运行此修改后的代码打印 "begin\n check\n Syntax OK";使用 raku 运行它打印 "begin\n check\n ===SORRY!==="(以及错误消息的其余部分)。
如果我删除 say f 'foo'行(以及编译错误), raku -c仍然打印 "begin\n check\n Syntax OK"但 raku打印“begin\n check\n init\n Type check failed...\n end”(再次省略错误消息的正文)。
这里发生了什么?是否产生了 ===SORRY!=== 的编译错误?在 CHECK 和 INIT 之间发生一段时间(有没有这样的时间?)?还是 raku -c实际上不是“运行 BEGIN 和 CHECK 块”为 raku --help表示?或者是其他东西?
相关:如果有的话,这些与“嵌套编译时间”的想法有什么联系?这段代码的执行是否涉及任何嵌套的编译时间,还是仅在使用模块时才会发生?有什么方法可以记录/记录单独的编译阶段(可能正确放置 BEGIN 块?)还是没有公开的东西?

最佳答案

SORRY 消息是静态优化器的副作用。观察以下行为之间的差异:

$ raku -e 'sub foo(Int $a) { }; foo "foo"'
===SORRY!=== Error while compiling -e
Calling foo(Str) will never work with declared signature (Int $a)
和:
$ raku --optimize=off -e 'sub foo(Int $a) { }; foo "foo"'
Type check failed in binding to parameter '$a'; expected Int but got Str ("foo")
in sub foo at -e line 1
发生在 CHECK 之间和 INIT时间,除非它已被禁用。请注意,禁用静态优化器会导致运行时错误。

关于compilation - Raku 程序编译和执行的顺序(可能是嵌套编译阶段?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68018277/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com