【问题标题】:Overloading constants in Perl 6Perl 6 中的重载常量
【发布时间】:2014-11-15 17:02:54
【问题描述】:

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

特别是我想得到一个使用的文字值的字符串,例如如果代码是

my $x = .1e-003 ;

我需要".1e-003" 而不是0.0001

【问题讨论】:

  • 您可以与$x.perl 接近,结果为0.0001e0。真的,如果这是您想要的,最好将其存储为字符串,并在需要时将其用作数字。
  • 您可以使用 sprintf 将其格式化为科学记数法(如果您想要字符串方法),但 Brad Gilbert 的方法可能是最好的。
  • 我觉得我举的例子太具体了。总体意图是能够在 Perl 6 中重载常量。overload::constant 的独特之处在于它在完成任何解释/简化之前给了我原始字符串。

标签: perl operator-overloading raku


【解决方案1】:

我刚刚添加了这样一个模块:

https://github.com/FROGGS/p6-overload-constant

用法:

use v6;
sub decimal { $^a.flip }
use overload::constant &decimal;

say .1e-003 # "300-e1."

【讨论】:

  • 我是否像使用普通 Perl 模块一样使用它?我得到Null PMC access in get_bool()。我正在将 Rakudo 与从源代码构建的 Parrot 一起使用。
  • 我刚刚在 Moarvm 上的 rakudo 上进行了测试。 (无论如何,它的构建和运行速度更快)。但我也会在 Parrot 和 JVM 上对其进行测试,并希望尽快提供补丁。
  • 非常感谢。它工作得很好。我还尝试返回一个对象并获得Unknown QAST node type Bool,但我会自己调试一下。
【解决方案2】:

您可以通过与but 运算符混合使用适当的角色来更改值的字符串化方式,即

0.0001 but role { method Str { ".1e-003" } }

可以简写为

0.0001 but ".1e-003"

请注意,从语义的角度来看,提供方法 Stringy 而不是 Str 实际上可能更合适,但我认为 Rakudo 到今天为止并不能在所有情况下都正确处理这种区别。

【讨论】:

    【解决方案3】:

    我认为规范或现有库中不存在像 overload::constant 这样的东西,但应该可以通过在 AST 中查找您感兴趣的文字类型来使用 macros 编写它, 并将其替换为对象构造函数或您需要的任何内容。

    也许更简洁的方法是将这些常量中的每一个都包装在一个宏调用中,而不是用一个来跨越整个程序。

    【讨论】:

    • 这看起来很有趣。例如,我得到一个带有my $ast = quasi { 1+2 } ;AST 对象,但我找不到如何继续。它说here 还没有定义 API,所以目前这可能是不可能的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-14
    相关资源
    最近更新 更多