在Perl 6中如何对常量进行重载

4
在Perl 6中是否可以重载常量?我正在查看这里的Perl 5示例。

特别是,我想获得使用的文字值的字符串,例如,如果代码是:
my $x = .1e-003 ;

我需要用 ".1e-003" 代替 0.0001


你可以使用$x.perl来接近结果为0.0001e0的值。但如果这正是你想要的,最好将其存储为字符串,并在需要时将其用作数字。 - Brad Gilbert
你可以使用sprintf将其格式化为科学计数法(如果你想要一个字符串方法),但Brad Gilbert的方法可能是最好的。 - bytepusher
我认为我给出的例子太具体了。一般意图是能够在Perl 6中重载常量。overload::constant 的独特之处在于它在执行任何解释/简化之前提供原始字符串。 - user2660278
3个回答

8

我该像普通的Perl模块一样使用它吗?我得到了get_bool()中的“Null PMC access”错误。我正在使用从源代码构建的Parrot的Rakudo。 - user2660278
我刚在Moarvm上测试了它(无论如何都能构建和运行得更快)。但我也会在Parrot和JVM上进行测试,并希望尽快提供一个补丁。 - Tobias Leich
非常感谢,它运行得很好。我还尝试返回一个对象并获得“未知的QAST节点类型Bool”,但我会自己尝试调试。 - user2660278

3
您可以通过使用适当的角色与but运算符混合来更改值字符串化的方式,例如:
0.0001 but role { method Str { ".1e-003" } }

可以缩写为:
0.0001 but ".1e-003"

请注意,从语义角度来看,提供一个方法Stringy而不是Str可能更合适,但我认为Rakudo在所有情况下都没有正确处理这种区别。

1
我认为规范或现有库中没有类似于overload::constant的东西,但是可以使用编写它,通过查找您感兴趣的文字类型的AST,并将其替换为对象构造函数或所需内容。更清晰的方法可能是将这些常量中的每一个都包装在宏调用中,而不是在整个程序中跨度一个宏调用。

这看起来很有趣。例如,我使用 my $ast = quasi { 1+2 } ; 得到一个 AST 对象,但我不知道如何继续。它在这里说目前还没有定义 API,所以也许现在还不可能。 - user2660278

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接