如何从 RakuAST 中提取数据

Ric*_*rth 5 raku

config从a 的部分中提取哈希值如何最好RakuAST::Doc::Block?这是程序:

use v6.d;
use experimental :rakuast;

my $ast = Q:to/CONF/.AST;
=for rakudoc :category("Language") :kind<sub> :subkind<operator>
Stuff
CONF
my $block = $ast.rakudoc[0];
my %config = $block.config.pairs.map( { .key  =>  .value.DEPARSE } );
say %config.raku
Run Code Online (Sandbox Code Playgroud)

这是结果。

{:category("(\"Language\")"), :kind("<sub>"), :subkind("<operator>")}

Run Code Online (Sandbox Code Playgroud)

.DEPARSE正在生成引号,即("...")<...>。我怎样才能提取字符串?

Eli*_*sen 5

.DEPARSE方法尝试重新创建原始的 Raku 代码。对于字符串,这意味着包含引号。

如果您想获取实际值,您可以.literalize在任何 RakuAST 对象上调用该方法。Nil如果无法文字化,则返回;如果可以,则返回实际值。

更新:我上次做这件事已经有一段时间了。虽然上面的方法可行,但实际上已经有一种方法可以 DWIM .resolved-config:。所以:

my %config := $block.resolved-config;
say %config;
Run Code Online (Sandbox Code Playgroud)

将产生:

Map.new((category => Language, foo => (a => 42 b => 666), kind => sub, subkind => operator))
Run Code Online (Sandbox Code Playgroud)

请注意使用:=代替=。虽然意志=也可以工作,但意志:=更加有效,因为它不需要复制任何东西。