如何使用 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";
}
我正在试验 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";
}