插入而不在Raku中创建字符串上下文?
如果我有一个变量my $a = True,那么我从下面的代码中得到这个输出:
say «a list of words foo $a bar baz».raku;
# OUTPUT: ("a", "list", "of", "words", "foo", "True", "bar", "baz")
也就是说,即使结果是 a List,元素True在被包含在列表中之前也会被字符串化——列表包含"True",而不是True。有什么方法可以在仍然使用插值的同时避免这种字符串化?
如果$a是我定义的类(因此可以Str为其编写方法)而不是 ,那么有没有办法做到这一点Bool?
(我知道我可以写更详细的("a", "list", "of", "words", "foo", $a, "bar", "baz")or «a list of words foo».Slip, $a, «bar baz».Slip,但我问是否有办法仍然使用插值)。
回答
插值是将一个东西放入一个字符串中。
"a b c $thing d e f"
它首先将事物本身变成一个字符串,然后将字符串的其余部分串联起来。
基本上上面编译成这个代码:
infix:<~>( ?a b c ?, $thing.Str, ? d e f? )
« a b c $thing »
简称:
Q :double :quotewords « a b c $thing d e f »
那就是使用Quoting DSL,打开:double引用语义 ( “”) 并打开:quotewords.
:quotewords是将字符串拆分为其各个部分的功能。它只有在变成字符串后才会发生。
想象一下,上面编译成:
Internals::quotewords( infix:<~>( ? a b c ?, $thing.Str, ? d e f ? ) )
除了使用.Slipor prefix 之外,还有另一种方法可以得到你想要的东西|。
flat «a list of words foo», $a, «bar baz»
引用 DSL 的全部目的是生成一个字符串。
也就是说:words, :quotewords, 和:val所有更改它,以便它返回单个字符串以外的其他内容。他们的想法是改变 DSL。
所以也许你可以说服足够多的人相信这样的改变是值得的。那是一个很大的可能。
它可能会破坏许多现有的代码库,因此您将面临一场艰苦的战斗。