我如何测试动态变量是否存在?

问题描述 投票:2回答:1

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

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

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

因此,是否可以执行这样的检查,如果可以,怎么做?

perl6 raku dynamic-scope
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')

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

© www.soinside.com 2019 - 2024. All rights reserved.