gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 06:14:17 25 4
gpt4 key购买 nike

据我了解,动态变量是在运行时查找的。我想使用它们来启用类似于 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')

由于我没有研究过您想要实现的目标,因此可能有更合适的解决方案。

关于raku - 如何测试动态变量是否存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33420693/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com