我试图用
Devel::Declare创建关键字时遇到麻烦.在这件事上没有很多的例子和教程.
我的宠物项目是创建一个名为“做的”的新关键字,其类似于Ruby的做法,如下所示:
my @arr = qw/foo bar baz/; @arr doing $x { print "x is $x"; };
我的想法是把它变成一个为我的$x(@arr){…}语句与Devel :: Declare解析钩子.我不知道这是否可行.
我发现的大多数例子(从Devel::Declare测试目录)都是用于创建一个方法样式的关键字.
解决方法
> Devel :: Declare不会让你收回已经解析的内容.如果你把关键字做成一个关键字,那么@arr在做…仍然需要转换成以@arr开头的东西,这似乎是一个相当大的障碍.
>因为Devel :: Declare的功能,它的魔法就会受到限制 – 它只能以特定的方式受到限制 – 它只允许你声明一个看起来像是subs的名字的关键字,在Perl会寻找一个sub的名字.它不会让你把任意的操作符放在你喜欢的地方.事实上,它可以用最少的扭曲,在你有关键字somestuff {…}的情况下,它可以变成一个简单的关键字调用(一些其他的东西和一个可能转换的子{…}).你可以看到为什么它像方法或Test :: Class :: Sugar这样的东西很好.我的观点是数组名称之后不是perl解析器正在寻找一个sub的名称;这是一个解析器正在寻找一个操作符的地方,所以@arr这样做会给你一个谜语,在Devel :: Declare有机会干预之前,操作者预期的错误会被发现.
>因为Devel :: Declare的功能,它的魔法就会受到限制 – 它只能以特定的方式受到限制 – 它只允许你声明一个看起来像是subs的名字的关键字,在Perl会寻找一个sub的名字.它不会让你把任意的操作符放在你喜欢的地方.事实上,它可以用最少的扭曲,在你有关键字somestuff {…}的情况下,它可以变成一个简单的关键字调用(一些其他的东西和一个可能转换的子{…}).你可以看到为什么它像方法或Test :: Class :: Sugar这样的东西很好.我的观点是数组名称之后不是perl解析器正在寻找一个sub的名称;这是一个解析器正在寻找一个操作符的地方,所以@arr这样做会给你一个谜语,在Devel :: Declare有机会干预之前,操作者预期的错误会被发现.
这两个可能可以通过改变事情来克服,以便您的关键字首先出现在线上,但现在您已经有关键字somestuff {…},其中数组的名称是somestuff,而且您完全符合大多数其他模块已经被雕刻出来了 – 只有当你生成for循环时,你可能会将块作为一个真正的块而不是将其作为子定义来解析.