【发布时间】:2011-06-16 07:35:10
【问题描述】:
在给定 Erlang 中的一个复杂对象的情况下,是否有一种通用的方法可以为它提供一个有效的函数声明,而不是直接关注它?我正在维护一些以前由喜欢巨型结构的人编写的代码,事实证明手动执行它很容易出错。 我不需要迭代整个事情,只需抓住顶层本身。
例如,我现在正在处理这个 -
[[["SIP",47,"2",46,"0"],32,"407",32,"Proxy Authentication Required","\r\n"],
[{'Via',
[{'via-parm',
{'sent-protocol',"SIP","2.0","UDP"},
{'sent-by',"172.20.10.5","5060"},
[{'via-branch',"z9hG4bKb561e4f03a40c4439ba375b2ac3c9f91.0"}]}]},
{'Via',
[{'via-parm',
{'sent-protocol',"SIP","2.0","UDP"},
{'sent-by',"172.20.10.15","5060"},
[{'via-branch',"12dee0b2f48309f40b7857b9c73be9ac"}]}]},
{'From',
{'from-spec',
{'name-addr',
[[]],
{'SIP-URI',
[{userinfo,{user,"003018CFE4EF"},[]}],
{hostport,"172.20.10.11",[]},
{'uri-parameters',[]},
[]}},
[{tag,"b7226ffa86c46af7bf6e32969ad16940"}]}},
{'To',
{'name-addr',
[[]],
{'SIP-URI',
[{userinfo,{user,"3966"},[]}],
{hostport,"172.20.10.11",[]},
{'uri-parameters',[]},
[]}},
[{tag,"a830c764"}]},
{'Call-ID',"90df0e4968c9a4545a009b1adf268605@172.20.10.15"},
{'CSeq',1358286,"SUBSCRIBE"},
["date",'HCOLON',
["Mon",44,32,["13",32,"Jun",32,"2011"],32,["17",58,"03",58,"55"],32,"GMT"]],
{'Contact',
[[{'name-addr',
[[]],
{'SIP-URI',
[{userinfo,{user,"3ComCallProcessor"},[]}],
{hostport,"172.20.10.11",[]},
{'uri-parameters',[]},
[]}},
[]],
[]]},
["expires",'HCOLON',3600],
["user-agent",'HCOLON',
["3Com",[]],
[['LWS',["VCX",[]]],
['LWS',["7210",[]]],
['LWS',["IP",[]]],
['LWS',["CallProcessor",[['SLASH',"v10.0.8"]]]]]],
["proxy-authenticate",'HCOLON',
["Digest",'LWS',
["realm",'EQUAL',['SWS',34,"3Com",34]],
[['COMMA',["domain",'EQUAL',['SWS',34,"3Com",34]]],
['COMMA',
["nonce",'EQUAL',
['SWS',34,"btbvbsbzbBbAbwbybvbxbCbtbzbubqbubsbqbtbsbqbtbxbCbxbsbybs",
34]]],
['COMMA',["stale",'EQUAL',"FALSE"]],
['COMMA',["algorithm",'EQUAL',"MD5"]]]]],
{'Content-Length',0}],
"\r\n",
["\n"]]
【问题讨论】:
-
我很乐意回答。我只是不知道实际的问题是什么。 “有效的函数声明”是什么意思?你的意思是生成数据结构的东西,还是可以读取数据结构的东西?或者别的什么。
-
抱歉,措辞不明确 - 本质上,假设您有一个 3 元组,看起来像这样 { 4, blah, [] }。您可以通过查看它来简单地推导出,您需要一个如下所示的函数: myfunc( { A, B, C } ) 。如果你有一个大的、嵌套的元组/列表——甚至更好,很多,并且你需要创建作用于每一个的函数,那么找出每个变体顶层的“形状”是非常耗时的.
-
我也很疑惑。阅读还是创作?通用代码或一些帮助生成代码,例如功能。或者,也许只是目测的一些帮手。而且我不得不这么说,以保护无辜者这些看起来像一些丑陋的结构,不要在家里这样做!
标签: erlang