如何测试动态变量的存在性



据我所知,动态变量是在运行时查找的。我想使用它们来实现类似于球拍参数的参数化。

要做到这一点,我必须设置一个默认值,它应该是可重写的,但不一定是可更改的。我目前的方法相当简单:

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 } };

那么,有可能进行这样的检查吗?如果有,是如何进行的?

报价S02:

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

如果您想访问尚未在当前(动态)范围中定义的动态变量,则以下任一项都应该有效:

$*param // 'default value'
# Any if not found
DYNAMIC::<$*param>
# Nil if not found
try $*param
# Mu if not found
use nqp;
nqp::getlexdyn('$*param')

由于我还没有研究过你试图实现的目标,可能会有更合适的解决方案。

最新更新