当前位置:  开发笔记 > 编程语言 > 正文

我可以在Perl中编写DSL吗?

如何解决《我可以在Perl中编写DSL吗?》经验,为你挑选了2个好方法。

我们使用Perl进行GUI测试自动化.它非常成功.我们为GUI测试编写了一种非常轻量级的DSL语言.DSL与对象模型非常相似.

例如,我们在根目录下有一个Application对象.应用程序中的每个属性表都是一个View对象.页面下的每个页面都称为Page对象本身.从Perl我们将命令发送到GUI应用程序,GUI解释命令并很好地响应命令.要发送命令,我们执行以下操作:

socket_object->send_command("App.View2.Page2.Activate()")
socket_object->send_command("App.View1.Page3.OKBtn.Click()")

这不是很易读.相反,我想为App,View和Page编写Perl DSL.Perl是否提供某种DSL结构,我可以执行以下操作?

App.View2.Page2.Activate();
App.View1.Page2.Click();

App应该是Application类的一个实例.我必须在运行时获取View2的对象.

怎么用这样的东西?



1> Axeman..:

你可以在Perl中做任何事情.但是你必须做一些奇怪的事情来让Perl使用不是Perl的语法来执行.

要准确处理你所拥有的东西,你将需要许多高级技巧,根据定义,这些技巧不是可维护的.你必须:

重载连接运算符'.' (需要有福的参考)

关闭限制或创建一个AUTOLOAD潜艇以允许那些裸露的单词 - 当然,你可以为你想要使用的所有单词(或使用barewords模块)编写subs .

可能,创建多个包,多个AUTOLOADs

另一种方式是源过滤器,我可能只是为了提及这种功能而选择了一个downvote .所以我不会向那些寻求帮助的人推荐这种方法.但它就在那里.源代码过滤器(我已经完成了我的分享)只是其中一个你可以认为自己太聪明的领域.

尽管如此,如果您对Perl作为DSL"主机"语言感兴趣,那么源过滤器并非完全不受限制.但是,将此限制为您要显示的内容,Perl6 :: Attributes可能会完成您现在需要的大部分内容.它需要.并将它们转换为Perl理解的" - >".但您仍然可以查看源过滤器以了解幕后发生的事情.

我也不想离开这个话题而不建议你使用Damian Conway的Filter :: Simple来减轻你可能产生自己的源过滤器(我建议不做)的许多挫折感.

最简单的是放弃'.' 运算符,而只是期望看起来像Perl的代码.

App->View2->Page2->Activate(); 
App->View1->Page2->Click();

App将是一个包或一个子.在当前包中定义或者导入,它返回一个对象,该对象被祝福到一个包中,该View2子包(可能是一个AUTOLOAD子包)返回一个包的名称或一个包含的包含的引用,它可以理解Page2,然后最终返回会理解ActivateClick.(如果需要,请参阅OO教程.)



2> skiphoppy..:

我建议你放弃尝试做怪异的"DSL"东西,然后编写Perl类来处理你想要管理的对象.我建议您考虑使用新的Moose Perl对象系统,尽管传统的Perl OO会很好.深入了解OO教程的Perl文档; 他们都是伟大的.

推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有