将记录转换为proplists(并返回)

将记录转换为proplists(并返回)

问题描述:

我有一个基于Mochiweb和Mnesia的Erlang web应用程序,它使用并发出JSON。在Mnesia存储记录是有意义的;但是Mochiweb/Mochijson需要proplist格式的数据。所以我最终得到了大量的样板代码:将记录转换为proplists(并返回)

-record(foobar, {name, value}). 

record_to_proplist(Record)-> 
    [{name, Record#foobar.name}, 
    {value, Record#foobar.value}]. 

proplist_to_record(Props)-> 
    #foobar{name=proplists:get_value("name", Props), 
      value=proplists:get_value("value", Props)}. 

很好,只有一个小记录,有很多大记录的痛苦。任何人都可以提出一个方法来处理所有这些样板代码?我想我需要一些动态检查记录字段的方法;由于记录是一个编译时构造,我猜[假设这是可能的],这意味着通过宏注入代码..

谢谢!

这听起来像exprecs就是你升ooking为:

http://forum.trapexit.org/viewtopic.php?p=21790

从描述阅读:

该模块是解析变换 让您导出记录。 变换为 实例化,检查和 添加访问器函数,而不必 在模块之间引入编译时相关性 。

看看这是否有帮助。

+0

把DanialLuna的其他答案放在一起:列表:zip(league2:'#info - '(Rec),tl(tuple_to_list(Rec)) )。 – f3r3nc 2013-03-20 14:20:23

+0

链接已死,请在将来填写完整的答案。 – drozzy 2016-11-22 17:18:45

使用record_info(字段,foobar)可以动态地执行某些操作。然而,record_info也是一个编译时构造,所以记录名称不能是变量,所以对于每个要转换的记录需要一个子句。

你应该能够做这样的事情:

-record(foobar, {name, value}). 
-record(foo, {other, fields, 'and', stuff}). 

record_to_proplist(#foobar{} = Rec) -> 
    lists:zip(record_info(fields, foobar), tl(tuple_to_list(Rec))); 
record_to_proplist(#foo{} = Rec) -> 
    lists:zip(record_info(fields, foo), tl(tuple_to_list(Rec))). 

等等

(或者作为一个宏(还是创建一个功能,虽然,该版本在宏为R2P(拍摄,foobar的)实在是太丑陋):

-define(R2P(Record), record_to_proplist(#Record{} = Rec) -> 
      lists:zip(record_info(fields, Record), tl(tuple_to_list(Rec)))). 

?R2P(foobar); 
?R2P(foo). 

+0

不错,但我还是要为每一个记录record_to_proplist。想想正确的方法可能是编码生成这个东西。 – Justin 2010-09-23 20:31:07

+1

您可以使用“find。-name”* rl“-exec grep - '-record('{} \; | sed's/-record(\([^,] * \) – 2010-09-24 15:25:45

对此的接受答案已经很长时间了。

简短的回答是使用Ulf Wiger的exprecs。

exprecs是uwiger/parse_trans

一个parse_transform上如何工作在Web归档被归档的文章:http://web.archive.org/web/20130729014934/http://forum.trapexit.org/viewtopic.php?p=21790