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

ojo*_*lva 10 perl

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

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

my @arr = qw/foo bar baz/;
@arr doing $x {
    print "x is $x";
};
Run Code Online (Sandbox Code Playgroud)

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

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

我会很感激有关如何入门的一些指示,或者用于处理的关键功能,或者基于我的现有代码.

hob*_*bbs 14

  1. Devel :: Declare不会让你收回已被解析的内容.如果您打开doing到一个关键字,则@arr doing ...仍然需要转换到的东西,开始@arr,这似乎是一个相当大的障碍.
  2. 由于Devel :: Declare实际上它的魔力,它以特定的方式限制 - 它只允许你在Perl将寻找 sub的名称的地方声明看起来像subs的名字的"关键字" .它不会让你把任意操作符放在你喜欢的地方.事实上,在你拥有keyword 一些 { ... }可以变成对keyword(其他东西 的简单调用和可能转换的东西的情况下,它可以用最少的扭曲sub { ... }).你可以看出它为什么能够很好地适应像method或者这样的东西Test::Class::Sugar.我的观点是,在数组名称之后不是 perl解析器正在寻找sub的名称的地方; 它是解析器正在寻找操作符的地方,因此在Devel :: Declare有机会进行干预之前@arr doing ...会给你一个bareword found where operator expected错误.

这两种方法都可以通过改变方式来克服,以便你的关键字首先显示在行上,但是现在你有了keyword 某些元素 { ... },其中数组的名称是某些元素,并且你已经完全符合大多数其他模块所具有的模式雕刻出来 - 只有当你生成一个for循环时,你可能会将该块作为一个真正的块而不是让它被解析为一个子定义.

  • 这就解释了为什么一切都是如此"方法"导向.谢谢.顺便说一下,我刚刚发现我可以用普通的Perl做一些非常相似的东西:`@ arr ~~ sub {my $ x = shift; print"x is $ x"}`.也许我会尝试将它与Devel :: Declare结合起来. (2认同)