使用Devel :: Declare创建一个新的Perl关键字

时间:2011-02-27 20:30:34

标签: perl

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

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

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

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

我发现的大部分示例(来自Devel::Declare测试目录)都是用于创建method - 样式关键字。

我很欣赏一些关于如何开始使用的指针,或者用于处理的关键函数,或者基于我的现有代码。

1 个答案:

答案 0 :(得分:14)

  1. Devel :: Declare不会让你收回已被解析的内容。如果您将doing转换为关键字,那么@arr doing ...仍然需要转换为以#{1}}启动的内容,这似乎是一个相当大的障碍。< / LI>
  2. 由于Devel :: Declare实际上有其魔力的方式,它以特定的方式受到限制 - 它只允许你在Perl将看<的地方声明看起来像潜艇名称的“关键字” / em>表示子名称。它不会让你把任意操作符放在你喜欢的地方。事实上,在@arr somestuff keyword的情况下,它可以解决最小的扭曲,它可以变成对{ ... } 的其他一些简单的调用东西和可能已经改造的 keyword(。你可以看到它为什么能够很好地适应sub { ... })method之类的东西。我的观点是,在数组名称之后不是,perl解析器正在寻找sub的名称;它是解析器正在寻找运算符的地方,因此{6}会在Devel :: Declare有机会进行干预之前给出Test::Class::Sugar错误。
  3. 可以通过更改内容来解决这两个问题,以便您的关键字首先显示 ,但现在您已@arr doing ... somestuff {{ 1}}数组的名称是 somestuff ,并且你坚定地处于大多数其他模块已经雕刻出来的模式中 - 只有当你生成一个for循环时,你才会' ll可能会将块作为一个真正的块而不是让它被解析为一个子定义。