【问题标题】:Creating a new Perl keyword with Devel::Declare使用 Devel::Declare 创建新的 Perl 关键字
【发布时间】:2011-02-28 09:06:45
【问题描述】:

我在尝试使用 Devel::Declare 创建关键字时遇到问题。在这件事上没有很多例子和教程。

我最喜欢的项目是创建一个名为 doing 的新关键字,其语法类似于 Ruby 的 do,例如:

my @arr = qw/foo bar baz/;
@arr doing $x {
    print "x is $x";
};

我的想法是把它变成带有Devel::Declare 解析钩子的for my $x (@arr) { ... } 语句。我不确定这是否可能。

我发现的大多数示例(来自Devel::Declare 测试目录)都是用于创建method 风格的关键字。

我会很感激一些关于如何开始的指示,或者能够处理的关键功能,或者我的现有代码。

【问题讨论】:

    标签: perl


    【解决方案1】:
    1. Devel::Declare 不会让您收回已解析的内容。如果将doing 转换为关键字,那么@arr doing ... 仍然需要转换为以@arr 开头的东西,这似乎是一个相当大的障碍。
    2. 由于 Devel::Declare 真正发挥其魔力的方式,它以特定方式受到限制——它只允许您在 Perl 将查找的位置声明看起来像子名称的“关键字” /em> 为子的名称。它不会让您将任意运算符放在您喜欢的位置。实际上,在您拥有keyword somestuff { ... } 的情况下,它可以以最小的扭曲工作,它可以变成对keyword(的简单调用一些其他的东西和可能转换的sub { ... })。您可以看到为什么它非常适合methodTest::Class::Sugar 之类的东西。我的观点是,紧跟在数组名称之后的 不是 perl 解析器正在寻找子名称的地方;这是解析器寻找操作符的地方,所以@arr doing ... 会在 Devel::Declare 有机会干预之前给你一个bareword found where operator expected 错误。

    这两个问题都可以通过改变事情来克服,以便您的关键字出现在 first 上,但现在您有 keyword somestuff { ... } 在哪里数组的名称是 somestuff,并且您完全处于大多数其他模块已经划分出来的模式中——只有当您生成一个 for 循环时,您可能会离开将块作为真正的块,而不是将其解析为子定义。

    【讨论】:

    • 这就解释了为什么一切都是以method 为导向的。谢谢。顺便说一句,我刚刚发现我可以用普通的 Perl 做一些非常相似的事情:@arr ~~ sub { my $x = shift; print "x is $x" }。也许我会尝试将它与 Devel::Declare 结合起来。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-29
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多