Perl6 中的字符串插值

String interpolation in Perl6

我很难弄明白为什么会出现这种说法

say "\c500";

在我的屏幕上按预期生成字符 'Ǵ',而以下语句在编译时给我一条错误消息 ("Unrecognized \c character"):

my $i = 500;
say "\c$i";

即使

say "$i"; # or 'say $i.Str;' for that matter

生成“500”(“$i”。WHAT 表示类型 Str)。

您必须使用 $i.chr,已记录 here\c 在字符串中专门处理,似乎不接受任何非文字的内容。

Perl 6 中的字符串文字解析器是一种领域特定语言。

基本上,您编写的内容会像语言的其余部分一样得到编译。

"abc$_"
&infix:«~»('abc',$_.Str)

\c500 的情况下,您可以将其视为编译时常量。

"\c500"
(BEGIN 500.chr)

其实更像是:

(BEGIN 500.HOW.find_method_qualified(Int,500,'chr').(500))

除了字符串文字的编译器实际上试图将其编译为抽象语法树,但由于没有添加代码来处理这种情况 \c.
即使有,\cBEGIN 时有效地编译为 运行,这是在 $_ 具有值之前。


另外 \c 用于 .chr

"\c9" eq "\c[TAB]" eq "\cI" eq "\t"

(请注意,\cI 表示您将通过键入 Cntrl+Alt+ 获得的字符i 在 posix 平台上)

那么 \c$_ 应该编译成哪些?

$_.chr
$_.parse-names
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.index($_).succ.chr

如果你想要.chr你可以写成下面的一种。 (在允许的地方添加空格)

"abc$_.chr( )def"
"abc{ $_.chr }def"
"abc{ .chr }def"
'abc' ~ $_.chr ~ 'def'