我有一个基于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)
)
听起来 exprecs 就是您正在寻找的:
http://forum.trapexit.org/viewtopic.php?p=21790
从描述中读取:
该模块是一个解析转换,允许您导出记录。该转换添加了用于实例化、检查和修改记录的访问器函数,而无需在模块之间引入编译时依赖关系。
看看这是否有帮助。
归档时间: |
|
查看次数: |
7024 次 |
最近记录: |