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

gha*_*.st 2 perl6 dynamic-scope

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

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

my $*param ::= 42;
sub parameterized-function { say $*param };
parameterized-function();
do {
    my $*param ::= 15;
    parameterized-function();
}
Run Code Online (Sandbox Code Playgroud)

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

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

sub parameterized-function { if defined($*param) { say 42 } else { say $*param } };
Run Code Online (Sandbox Code Playgroud)

那么,是否有可能进行这样的检查,如果是这样,它是如何完成的?

Chr*_*oph 5

引用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')
Run Code Online (Sandbox Code Playgroud)

由于我没有研究你想要完成的事情,可能会有更合适的解决方案.