我有一个生成数据的erlang程序.需要将此数据通过udp传输到非erlang程序以进行进一步处理.我已经有了这个部分 - 通过udp发送数据并在另一个非erlang端接收它.
这是问题所在.数据(像包含列表的元组一样的erlang术语)似乎不能"按原样"过去(即我不能只发送任意的erlang术语).显然需要先将其转换为文本或二进制文件.转换为二进制似乎很容易,我发现bif.问题是,二进制gobbledygook出现在另一边,我不知道任何简单的解码方法(另一方面是非erlang).
除非有人告诉我一些简单的方法来二进制官样文章的另一边进行解码,我想的要发送的数据为条件的简单字符串表示 - 例如像这样的元组:
{[1,2,3],[4,5,6]}
Run Code Online (Sandbox Code Playgroud)
像这样发送:
"{[1,2,3],[4,5,6]}"
Run Code Online (Sandbox Code Playgroud)
我没有看到任何这样的bif,即"convert_term_to_ascii/1"等.我知道我可以扫描它并发送条款的令牌表示,但我不想这样做 - 解码另一方面只是一个痛苦我不想处理.
我知道我不是第一个,第二个或第三个遇到这个问题的人.它必须相当普遍.通常如何处理?
有人能指出我一些资源,告诉我如何1)将二进制gobbledygook转换为ascii(在非erlang方面需要),或者2)直接将术语转换为字符串(在erlang方面需要)?
或者,告诉我我是怎么错的,我该怎么做呢?
谢谢.
我不是编译器优化专家.就编译器或优化而言,我甚至不确定什么是"合理的".我只是好奇,问问题都是.
无论如何,我正在编写一些基本形式的Erlang,例如:
% TOY EXAMPLE 1
test(X) ->
if
X-1 > 0 ->
yes;
X-1 == 0 ->
maybe;
true -> no
end.
Run Code Online (Sandbox Code Playgroud)
然后我对它进行了优化,以便不进行两次减法:
% TOY EXAMPLE 2
test(X) ->
Z = X-1,
if
Z > 0 ->
yes;
Z == 0 ->
maybe;
true -> no
end.
Run Code Online (Sandbox Code Playgroud)
然后我认为"浪费时间 - 无论如何,编译器肯定会将第一个例子优化到第二个例子中." 所以我决定通过运行带有'S'选项的compile:file进行检查.这是输出:
% TOY EXAMPLE 1
{function, test, 1, 15}.
{label,14}.
{func_info,{atom,exchange},{atom,test},1}.
{label,15}.
{gc_bif,'-',{f,16},1,[{x,0},{integer,1}],{x,1}}.
{test,is_lt,{f,16},[{integer,0},{x,1}]}.
{move,{atom,yes},{x,0}}.
return.
{label,16}.
{gc_bif,'-',{f,17},1,[{x,0},{integer,1}],{x,1}}.
{test,is_eq,{f,17},[{x,1},{integer,0}]}.
{move,{atom,maybe},{x,0}}.
return.
{label,17}.
{move,{atom,no},{x,0}}.
return.
% TOY EXAMPLE 2
{function, …Run Code Online (Sandbox Code Playgroud)