在不牺牲常规工作流程的情况下进行优化:参数、POD 等

uxe*_*xer 6 optimization program-entry-point command-line-arguments precompile raku

https://martimm.github.io/gnome-gtk3/content-docs/tutorial/Application/sceleton.html,缩写:

在 Raku 中,主程序保持小是很重要的。这是因为所有代码、程序和模块都被解析并编译成将由虚拟机执行的中间代码。大多数时候是 MoarVM,但也有一个 JVM,之后可能还有其他的。无论如何,在运行之前,已编译的模块会保存到 .precomp 目录中,但不会保存到程序中。这意味着程序总是在运行之前被解析和编译,这就是保持它小的原因。

use UserAppClass;

my UserAppClass $user-app .= new;
exit($user-app.run);
Run Code Online (Sandbox Code Playgroud)

好吧,你不能比这更小……,或者可以使用这种单衬;exit(UserAppClass.new.run).

其余代码在 UserAppClass 中定义。

非常好。

  1. 现在,我们的程序需要接受参数。sub MAIN解析参数并生成$*USAGE免费的,所以我们将利用sub MAIN.
    我们将d by programsub MAIN放入used 中,但我们得到的程序不知道参数。并且在模块中时不执行。 我们把入程序,以便它理解论点,但它已经不小了。.raku.rakumod.rakusub MAIN
    sub MAIN.raku

  2. 此外,嵌入POD的程序很可能会驻留在.raku程序中。
    放入POD一个used by.raku程序.rakumod,我们得到了POD一些隐藏的东西。
    POD进入.raku程序并再次它已经不小了。

  3. 另外,这种方法是否有任何命名约定?
    说,你有一个程序Report when your coffee is ready。它sub MAINcoffee-ready.raku,而你useQueryCoffeeMachine.rakumod
    您更改了文件的布局,现在对于同一个程序,Report when your coffee is ready您有一个coffee-ready.raku启动器,其中有一个coffee-ready.MAIN.rakumodwithsub MAIN的功能和一个QueryCoffeeMachine.rakumod.
    我相信QueryCoffeeMachine.rakumod保持不变,
    我觉得coffee-ready.raku尽管改变了它的内容也应该保持名称
    但应该如何coffee-ready.MAIN.rakumod命名?

rai*_*iph 5

无论如何,在运行之前,编译后的模块会保存到.precomp目录中,而不是程序中

Aiui 有人可以将预编译扩展到主程序文件,但对于核心开发人员来说这是一个低优先级,因为可以使用以下解决方案来解决它:

  1. ...sub MAIN在模块中时不执行。

如果您将其导出/导入到主程序中,则该模块MAIN将在您运行主程序时执行:

# MAIN.rakumod
our sub MAIN (Int $int-arg, Str $str-arg) { $int-arg }

# main.raku
use lib '.';
use MAIN;
Run Code Online (Sandbox Code Playgroud)
  1. ...我们让.raku程序不知道参数

如果您在主程序中wrap导入MAIN,您将知道参数:

# main.raku
use lib '.';
use MAIN;
&MAIN.wrap: -> |args { say args; callsame }
Run Code Online (Sandbox Code Playgroud)

(如果 CLI 传递的 args 与MAINMAIN模块导入的sub的签名不匹配,则显示使用消息。否则main.raku调用包装器并可以对传递的 args 做它想做的事情,并决定如何将调用导入的MAIN.)

(我从Can I capture the returns value of aroutine used in RUN-MAIN? 中提取了这个解决方案。)

  1. 将 POD 放入 ... .rakumod,我们将 POD 隐藏起来。

我不知道现有的方法可以避免这种情况。(也许从另一个 Raku 文件中检出Access POD以了解如何至少访问另一个文件中的 POD。)

也许一个新的问题只集中在那个方面是合适的?

  1. 应该怎么.MAIN.rakumod命名?

如果是我,在我的脑海中,我可能有一个Coffee-Ready文件夹,然后在其中,a coffee-ready.raku、 aMAIN.rakumod和 a QueryCoffeeMachine.rakumod