插入而不在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。

所以也许你可以说服足够多的人相信这样的改变是值得的。那是一个很大的可能

它可能会破坏许多现有的代码库,因此您将面临一场艰苦的战斗。


以上是插入而不在Raku中创建字符串上下文?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>