据我所知,动态变量在运行时被查找。我想使用它们来启用类似于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 } };
那么,是否有可能进行这样的检查,如果是这样的话呢?
答案 0 :(得分:5)
引用S02:
用户定义的动态变量通常应使用
::=
进行初始化,除非必须修改[变量]。 (将动态变量标记为readonly对于在竞争线程之间共享相同值非常有用,因为不需要锁定只读变量。)
如果要访问尚未在当前(动态)范围中定义的动态变量,则应满足以下任一条件:
$*param // 'default value'
# Any if not found
DYNAMIC::<$*param>
# Nil if not found
try $*param
# Mu if not found
use nqp;
nqp::getlexdyn('$*param')
由于我没有考虑过你想要完成什么,可能会有更合适的解决方案。