如何使用 EVAL 将参数传递给子例程?

How can I use EVAL to pass arguments to subroutines?

我正在试验 Raku 并试图弄清楚如何使用子命令编写程序。当我 运行, ./this_program blah:

#! /usr/bin/env raku
use v6;

sub MAIN($cmd, *@subcommands) {
    $cmd.EVAL;
}

sub blah() { say 'running blah'; };

我得到 running blah 输出。

但这是我所能得到的。我尝试了各种方法,但我没有看到将 @subscommands 传递给 blah 函数的明显方法。

我什至不确定 EVAL 是否可行,但我找不到任何其他解决方案。

我认为 EVAL 在这里不是绝对必要的。您可以选择 indirect lookup,即

&::($cmd)(@sub-commands);

&::($cmd)点,函数&blah从字符串$cmd中查找出来,可以使用了;然后我们用 @sub-commands.

调用它

然后我们有

sub MAIN($cmd, *@sub-commands) {
    &::($cmd)(@sub-commands);
}

sub blah(*@args) {
    say "running `blah` with `{@args}`";
}

和运行作为

$ raku ./program blah this and that

给予

running `blah` with `this and that`

制作 MAIN multi 也可能是一个解决方案:

multi sub MAIN('blah', *@rest) {
    say "running blah with: @rest[]";
}
multi sub MAIN('frobnicate', $this) {
    say "frobnicating $this";
}