我可以捕获RUN-MAIN中使用的例程的返回值吗?

Dan*_*ita 6 program-entry-point subroutine raku

我希望脚本运行从模块导出的子例程,而导出的子例程将在脚本中作为MAIN运行。该子例程执行我想要的所有操作,除了它返回结果而不是打印结果。

RUN-MAIN 似乎可以达到我的目标,但是我不确定如何获取例程的返回值。

有什么方法可以捕获要打印的RUN-MAIN例程的输出?RUN-MAIN是否适合这种事情?

wam*_*mba 5

您可以使用函数组合运算符infix:<?>infix:<o>

sub foo ($name, Int $n=1) { 
    "Hello $name\n" xx $n 
}; 
RUN-MAIN &say o &foo, Nil; #or &foo Ro &say
Run Code Online (Sandbox Code Playgroud)

但不幸的是,它正在改变签名

sub foo ($name, Int $n=1) { 
    "Hello $name\n" xx $n 
};

say &foo.signature;
say (&foo Ro &say).signature;
Run Code Online (Sandbox Code Playgroud)

因此默认USAGE消息不起作用。


Dan*_*ita 2

可以在包装例程中使用重新调度来调用原始例程。say然后可以用于包装内重新调度的结果。这也将生成原始例程的用法。

sub foo (
  $input #= The data we want
) {
  return $input;
}

&foo.wrap( sub (|) { callsame.say } );

RUN-MAIN &foo, Nil;
Run Code Online (Sandbox Code Playgroud)

$ raku filename.raku

Usage:
  filename.raku <input>
  
    <input>    The data we want
Run Code Online (Sandbox Code Playgroud)