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

Can I capture the returned value of a routine used in RUN-MAIN?

我想要一个脚本 运行 从模块导出的子程序,导出的子程序 运行 作为脚本中的 MAIN。子例程做我想做的一切,除了它 returns 结果而不是打印结果。

运行-MAIN 似乎 实现了我的大部分目标,但我不确定如何获取例程的返回值。

有没有一种方法可以捕获要打印的 运行-MAIN 例程的输出? 运行-MAIN 是处理这种事情的正确方法吗?

以下似乎实现了我的意图(其中 foo 是目标子)。

RUN-MAIN( &foo, Nil );

sub MAIN ( |c --> Nil ) {
  foo(|c).say;
}

编辑:不幸的是,这个解决方案并不理想,因为它运行 &foo 两次。

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

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

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

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

say &foo.signature;
say (&foo Ro &say).signature;

所以默认的 USAGE 消息不起作用。

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

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

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

RUN-MAIN &foo, Nil;

$ raku filename.raku

Usage:
  filename.raku <input>
  
    <input>    The data we want