浏览 3224 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-08-19
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}). 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |