当前位置: 首页 > 知识库问答 >
问题:

如果需要文件,Perl 6是否应该运行MAIN?

东门翰
2023-03-14

这里有一个声明主子程序的简短Perl 6程序。我应该只看到输出,如果我直接执行程序:

$ cat main.pm6
sub MAIN { say "Called as a program!" }

当我直接执行程序时,我会看到输出:

$ perl6 main.pm6
Called as a program!

如果将其作为模块加载,则看不到输出:

$ perl6 -I. -Mmain -e "say 'Hey'"
Hey

同样,如果我在程序内部使用它,我看不到输出:

$ perl6 -I. -e 'use main'

但是,如果我使用require,我会得到以下输出:

$ perl6 -I. -e 'require <main.pm6>'
Called as a program!

Synopsis06字面上说编译单元是直接调用的,而不是被需要的。是否因为require在运行时起作用(尽管S06不排除这一点)而发生了其他事情?

我在2016年7月和2016年10月的《乐谷之星》节目中也有同样的表现。

共有1个答案

艾自强
2023-03-14

首先,让我们来看看<>代码>要求< /C> >的行为:

根据(非授权)设计文件,

或者,文件名可以直接被提及,它安装了一个对当前词法范围有效匿名的包,并且只能通过模块安装的任何全局名称访问:

只有明确提及的名称才能如此导入。为了保护词法键盘的运行时神圣性,它不能被require修改。

结合S06的

只有在以下情况下才会执行此调用:

a) 编译单元是直接调用的,而不是另一个编译单元所要求的[…]

我的理解是,不应该运行未显式导入到主线词法范围的subMAIN

可悲的是,用户留档在运行时通过文件名导入的情况下是安静的,快速浏览(权威的)测试套件(特别是S11模块/需求)也没有给出答案,尽管我可能错过了。

现在,让我们来看看RKUDO的行为:

正如预期的那样,运行时通过静态或动态模块名称导入

require main;

require ::('main');

将不会运行MAIN,除非它同时声明为导出并显式导入,即

require main <&MAIN>;

require ::('main') <&MAIN>;

分别。

但是通过文件名导入

require 'main.pm6';

将立即运行MAIN

事实上,如果您通过

require 'main.pm6' <&MAIN>;

sub将执行两次:一次是在加载编译单元时执行,第二次是在运行时执行其在主线范围内查找和运行任何MAINsub的任务时执行。

Rakudo显然将带有文件名参数的要求或多或少地视为EVALFILE,并执行其主线,包括它遇到的任何子MAIN

这不是我所期望的,可能只是一个错误。

 类似资料:
  • 问题内容: 可以在本地运行JAR文件。下一步是在另一台PC上运行它。 问题是运行JAR文件是否需要JRE,JDK或两者都需要? 问题答案: JDK包含JRE。 大多数程序仅需要JRE(Java运行时环境),但是某些程序在运行时需要编译器,在这种情况下,您需要JDK。 如果您拥有JDK,则也不需要JRE。

  • 如果用注释对类进行注释,那么为了使用该类,该注释的定义必须在运行时类路径中吗?例如,给定注释 我能执行这个程序吗 类路径中没有component.class?(在我的测试中,我可以,但这个行为是由规范定义的吗?) 我这样问是因为有相互矛盾的说法,即使用库中的注释是否会创建对该库的依赖关系。

  • 在使用命令时,是否需要maven-surefire插件来运行单元测试? 我阅读了文档,知道它说: Surefire插件在构建生命周期的测试阶段用于执行应用程序的单元测试。它以两种不同的文件格式生成报告: 纯文本文件(. txt)XML文件(. xml)缺省情况下,这些文件是在${Basedir}/Target/surefire-报告中生成的。 然而,我在没有使用surefire插件的情况下运行了这

  • 问题内容: 我正在研究一个简单的代码,该代码从C / C ++应用程序运行Python函数。为了做到这一点,我设置了PYTHONPATH并运行初始化,如下所示: 然后,导入模块并运行函数。效果很好。 我现在正在尝试为我的同事构建一个安装程序以运行我的代码。出于明显的原因,我想减少需要在此安装程序中包含的文件数量。 仔细研究这个主题会告诉我,我应该能够包含文件“ Python27.lib”和“ Py

  • 问题内容: 我们必须一直构建String以便进行日志输出等等。在JDK版本中,我们了解了何时使用(很多追加,线程安全)和(很多追加,非线程安全)。 有什么使用建议?是高效的,还是在性能很重要的情况下我们被迫坚持采用单线连接? 例如丑陋的旧风格, 对比整齐的新样式(String.format,可能会更慢), 注意:我的特定用例是整个代码中数百个“单行”日志字符串。他们不涉及循环,所以太重了。我特别感

  • 关于tsconfig.json的官方手册说: 如果tsconfig.json中没有“files”属性,则编译器默认将所有TypeScript(*.ts或*.tsx)文件包含在包含目录和子目录中。当存在“files”属性时,只包含指定的文件。 如果指定了“exclude”属性,则编译器将包括包含目录和子目录中的所有TypeScript(*.ts或*.tsx)文件,但排除的文件或文件夹除外。 “Fil