相关疑难解决方法(0)

无法在接收块中使用Erlang/ets

我正在尝试使用Erlang/ets通过模式匹配接收数据来存储/更新各种信息.这是代码

start() -> 
    S = ets:new(test,[]),
    register(proc,spawn(fun() -> receive_data(S) end)).

receive_data(S) ->
    receive
        {see,A} -> ets:insert(S,{cycle,A}) ;
        [[f,c],Fcd,Fca,_,_] -> ets:insert(S,{flag_c,Fcd,Fca});
        [[b],Bd,Ba,_,_] -> ets:insert(S,{ball,Bd,Ba})



    end,
    receive_data(S).
Run Code Online (Sandbox Code Playgroud)

这里A是循环数,[f,c]是中心标志,[b]是球和Fcd,Fca,Bd,Ba是来自玩家的标志和球的方向和角度.

发件人进程正在发送这些信息.这里,模式匹配正常工作,我通过打印A,Fcd,Fca ...等的值来检查.我相信使用Erlang/ets有问题.

当我运行此代码时,我得到这样的错误

Error in process <0.48.0> with exit value: {badarg,[{ets,insert,[16400,{cycle,7}]},{single,receive_data,1}]
Run Code Online (Sandbox Code Playgroud)

谁能告诉我这段代码有什么问题以及如何解决这个问题?

erlang

5
推荐指数
1
解决办法
1115
查看次数

如何在Erlang或Elixir中序列化有向图用于导出目的

我正在使用Erlang的有向图模块来存储有向无环图(DAG).因此,为了论证,这里是一个超级简单的图形(使用Elixir):

gr = :digraph.new()
:digraph.add_vertex(gr, "A")
:digraph.add_vertex(gr, "B")
:digraph.add_vertex(gr, "C")
:digraph.add_edge(gr, "A", "B")
:digraph.add_edge(gr, "A", "C")
Run Code Online (Sandbox Code Playgroud)

看起来像这样:

在此输入图像描述

我们可以看到它一切正常:

iex(7)> :digraph.vertices(gr)
["A", "C", "B"]
iex(8)> :digraph.edges(gr)
[[:"$e" | 0], [:"$e" | 1]]
iex(9)> :digraph.out_neighbours(gr, "A")
["C", "B"]
iex(10)> :digraph.out_neighbours(gr, "B")
[]
iex(11)> :digraph.out_neighbours(gr, "C")
[]
iex(12)> :digraph_utils.is_acyclic(gr)
true
Run Code Online (Sandbox Code Playgroud)

现在我将添加和删除更多顶点和边缘,但我想将这些图形传输到Elixir/Erlang生态系统之外的应用程序,例如Cytoscape.js.是否有标准化的方法将有向图串行化为某种行业标准可读格式(例如json或xml),例如JGF,Netlix的Falcor JSON Graph格式或其他格式?

我可以编写自己的序列化程序,但我更喜欢预先存在的东西.我在digraphdigraph_utils中找不到任何这样的功能.

erlang elixir

4
推荐指数
1
解决办法
157
查看次数

标签 统计

erlang ×2

elixir ×1