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

Jus*_*tin 9 erlang

我有一个基于Mochiweb和Mnesia的Erlang webapp,它使用和发出JSON.将记录存储在Mnesia中是有意义的; 但是Mochiweb/Mochijson需要采用proplist格式的数据.所以我最终得到了大量的样板代码:

-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)}.  
Run Code Online (Sandbox Code Playgroud)

单个小记录很好,有很多大记录的痛苦.任何人都可以建议绕过所有这些样板代码吗?我想我需要一些动态检查记录字段的方法; 因为记录是一个编译时构造,我猜[假设它是可能的]这意味着通过宏注入代码.

谢谢!

Dan*_*una 22

你应该可以这样做:

-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))).
Run Code Online (Sandbox Code Playgroud)

等等.

(或者作为一个宏(仍然创建一个函数,宏的版本是什么?R2P(Rec,foobar)太丑了):

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

?R2P(foobar);
?R2P(foo).
Run Code Online (Sandbox Code Playgroud)

)


Rob*_*loi 2

听起来 exprecs 就是您正在寻找的:

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

从描述中读取:

该模块是一个解析转换,允许您导出记录。该转换添加了用于实例化、检查和修改记录的访问器函数,而无需在模块之间引入编译时依赖关系。

看看这是否有帮助。