论坛首页 综合技术论坛

recbird - 动态Erlang Record推断

浏览 3224 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-08-19  
Yariv写过一个recless:
http://yarivsblog.com/articles/2006/10/11/recless-a-type-inferring-parse-transform-for-erlang-experimental/

让Erlang中Record的存取写法变得简单,比如:
Project.owner.persion.address.city
可以代替:
((Project#project.owner)#person.address)#address.city

但recless是一个静态类型推断模块,就是说,需要在编译阶段就靠上下文推断出一个变量是否Record和是什么Record,这样recless就有一些限制,就是说你必须在代码中显式定义变量为一个record。

在写erlybird的过程中,我对Erlang的AST比较熟悉了,而且有了些主意,就花了两天写了一个动态的record推断模块,叫recbird,特点是再没有任何的限制,你几乎可以在程序的任何地方写V.a.b.c和V.a.b.c = 'Yes',而且性能是可以接受的,比如调用V.a.b = 'Yes'一百万次,在我的电脑上,正规的record需时约300ms,recbird需时约310ms,调用一千万次,正规的是2秒,recbird的需时大约是3秒。

背后的机制是:recbird会遍历Erlang编译好的AST树,然后为每个record的field插入一个setter/getter函数。在代码运行时,通过record变量的第一个元素知道这是什么record,然后转换到调用相应的setter/getter函数。

代码可以在如下地址获得:
http://erlybird.svn.sourceforge.net/viewvc/erlybird/trunk/erlybird/erlang-snippets/recbird.erl?revision=301&view=markup

编译recbird成recbird.beam后,置于你项目的code path路径下,然后在你的源代码中加上:
-compile({parse_transform, recbird}).
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics