如何测试动态变量是否存在?
How do I test a dynamic variable for existence?
据我了解,动态变量是在运行时查找的。我想使用它们来启用类似于 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 } };
那么,是否可以执行这样的检查,如果可以,它是如何完成的?
引用 S02:
User-defined dynamic variables should generally be initialized with ::=
unless it is necessary for [the] variable to be modified. (Marking dynamic variables as readonly is very helpful in terms of sharing the same value among competing threads, since a readonly variable need not be locked.)
如果要访问当前(动态)作用域中未定义的动态变量,以下任一方法都可以:
$*param // 'default value'
# Any if not found
DYNAMIC::<$*param>
# Nil if not found
try $*param
# Mu if not found
use nqp;
nqp::getlexdyn('$*param')
由于我没有研究过你想要完成的事情,可能会有更合适的解决方案。
据我了解,动态变量是在运行时查找的。我想使用它们来启用类似于 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 } };
那么,是否可以执行这样的检查,如果可以,它是如何完成的?
引用 S02:
User-defined dynamic variables should generally be initialized with
::=
unless it is necessary for [the] variable to be modified. (Marking dynamic variables as readonly is very helpful in terms of sharing the same value among competing threads, since a readonly variable need not be locked.)
如果要访问当前(动态)作用域中未定义的动态变量,以下任一方法都可以:
$*param // 'default value'
# Any if not found
DYNAMIC::<$*param>
# Nil if not found
try $*param
# Mu if not found
use nqp;
nqp::getlexdyn('$*param')
由于我没有研究过你想要完成的事情,可能会有更合适的解决方案。