2

据我了解,动态变量是在运行时查找的。我想用它们来启用类似于球拍参数的参数化。

为此,我必须设置一个可以覆盖但不一定可以更改的默认值。我目前的方法相当简单:

my $*param ::= 42;
sub parameterized-function { say $*param };
parameterized-function();
do {
    my $*param ::= 15;
    parameterized-function();
}

效果很好 - 除了它在外部范围上引入了参数的名称。my $*param = 15;除了感觉不整洁之外,如果在文件级别使用,它还会产生会导致混乱的副作用。

我想做的是检查参数是否已在调用堆栈上定义,如下所示:

sub parameterized-function { if defined($*param) { say 42 } else { say $*param } };

那么,是否可以执行这样的检查,如果可以,它是如何完成的?

4

1 回答 1

5

引用S02

::=除非需要修改 [the] 变量,否则通常应初始化用户定义的动态变量。(将动态变量标记为只读对于在竞争线程之间共享相同的值非常有帮助,因为不需要锁定只读变量。)

如果要访问尚未在当前(动态)范围内定义的动态变量,则以下任一方法都应该起作用:

$*param // 'default value'

# Any if not found
DYNAMIC::<$*param>

# Nil if not found
try $*param

# Mu if not found
use nqp;
nqp::getlexdyn('$*param')

由于我尚未调查您要完成的工作,因此可能会有更合适的解决方案。

于 2015-10-29T20:30:20.880 回答