我可以内省正则表达式的插值吗?

在下面的代码中,正则表达式$r清楚地“知道”它包含文本bar——这就是它能够与 Str 匹配的方式bar。但是.gist.raku报告$r包含变量$foo而不说明值$foo包含什么。有什么办法可以$r告诉我它的计算值吗?

sub f {
    my $foo = 'bar';
    g(rx/$foo/);
}

sub g($r) {
    say $r.gist;
    say 'bar' ~~ rx/$r/;
}

f # OUTPUT:  rx/$foo/
  #          ?bar?

(我知道我可以通过手动解析访问相同的信息$r,发现所有的变量,然后走&gcallframes中变量的值。但是,这似乎是一个相当脆弱的黑客得到的信息是,正则表达式显然已经知道,至少在某种程度上。)

回答

我可以内省正则表达式的插值吗?

不,因为它没有插值,就像在一个闭包中{ say $a }我们也不认为$a是被插值的,而是说它被关闭了。正则表达式中的变量编译为对该变量的查找,每次计算正则表达式时都会进行查找。这可以通过在正则表达式的评估之间更改变量的值来确认:

my $var = "foo";
my $rx = rx/$var/;
say "foobar" ~~ $rx;    # ?foo?
$var = "bar";
say "foobar" ~~ $rx;    # ?bar?

这里工作的更大原则是,在 Raku 中,正则表达式不是由标准库中的某些正则表达式实现处理的字符串,而是编译程序的一部分,并且与任何其他块或 thunk 遵循相同的闭包语义。

它们gist的来源主要是出于实用原因(Test模块中更好的诊断输出可能是驱动力),但是它是通过Regex在编译时附加到对象的源代码字符串精确完成的。在运行时,它都是字节码,并且不涉及您看到的源字符串。

  • No, closures *reference* their outer scope, and read (or even write) variables in that. Consider a function generator like `sub counter($start is copy) { -> { $start++ } }; my $c = counter(40); say $c(); say $c(); say $c();`, which relies on closure semantics not being about value, but also reference. (This is in contrast with the Java model, where the closure is created with values, which then may not be mutated.)

以上是我可以内省正则表达式的插值吗?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>