【问题标题】:How to create a string outside of Erlang that represents a DICT Term?如何在 Erlang 之外创建一个代表 DICT 术语的字符串?
【发布时间】:2013-03-27 00:20:49
【问题描述】:

我想在 Java 中构造一个字符串,它代表 DICT 术语,并将传递给 Erlang 进程以作为 erlang 术语(字符串到术语)反射回来。

我可以很容易地为 ORDDICT 实现这一点,因为它们在元组列表中构造为一个简单的排序键/值对,例如: [ {field1 , "value1"} , {field2 , "value2} ]

但是,对于 DICTS,它们被编译成一个特定的术语,我想找到如何对其进行逆向工程。我知道这种结构可以随着新版本的变化而改变,但是性能和易于集成到 Java 的好处将克服这一点。不幸的是,Erlang 的 JInterface 基于简单的数据结构。高效的 DICT 类型将非常有用。

一个简单的字典定义如下:

D1 = dict:store("field1","AAA",dict:new()).
{dict,1,16,16,8,80,48,
  {[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},
  {{[],[],[],[],[],[],[],[],
    [["field1",65,65,65]],
    [],[],[],[],[],[],[]}}}

从上面可以看出,有一些坐标我不明白它们的含义(数字 1、16、16、8、80、48 和一组空列表,它们也可能代表一些东西。

添加另外两行(键值对)会使数据看起来像:

D3 = dict:store("field3","CCC",D2).
{dict,3,16,16,8,80,48,
  {[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},
  {{[],[],
    [["field3",67,67,67]],
    [],[],[],[],[],
    [["field1",65,65,65]],
    [],[],[],[],
    [["field2",66,66,66]],
    [],[]}}}

从上面我可以注意到:

  • 第一个数字 (3) 表示 DICT 中的项目数。
  • 第二个数字 (16) 显示列表的第一个元组中的列表插槽的数量
  • 第三个数字 (16) 表示第二类列表中的列表 slots 的数量,其中的值最终被放置在(中间)。
  • 第四个数字 (8) 似乎是第二行元组中放置值的位置(一种索引指针)中的槽数
  • 剩余的数字(80 和 48)...不知道...
  • 添加键“field0”不是放在最后,而是放在“field1”的数据之后。这表明了索引方法。

所以问题,有没有办法(算法)可靠地直接从 Erlang 外部创建 DICT 字符串?

【问题讨论】:

  • 一般来说,依赖库的内部工作而不是公共接口并不是好的做法。内部结构随时可能发生变化,而界面应保持稳定。

标签: erlang


【解决方案1】:

可以在dict.erl 源代码中找到关于如何实现 dict 的全面规范。

但我不确定在 Java 中复制 dict.erl 的实现是否值得。这只有在你想要一个需要在 Java 和 Erlang 代码之间经常传递的快速 dict 之类的数据结构时才有意义。使用 Erlang 和 Java 中的键值对存储而不直接传递它可能更有意义。根据您的应用程序,这可能是例如riak 或者甚至可以将您的不同语言世界与RabbitMQ 联系起来。这两个示例都是在 Erlang 中实现的,并且可以从两个世界轻松访问。

【讨论】:

  • 谢谢。我实际上已经将 RabbitMq 用于通信目的,但出于性能原因想将预先消化的 DICT 发送给 erlang 队列使用者(在 java 端生成 proplist 与直接创建 DICT 而不是在 erlang 端倒带的成本. 只有基准测试才能判断...我会按照您的建议使用 dict.erl 源代码。600 多行代码...看起来并不太具有挑战性,可能值得将其转发到 JInterface 代码行。
  • @gextra 如果你想走这条路,你需要一个erlang:phash/2 的Java实现。 github.com/erlang/otp/blob/…
猜你喜欢
  • 2013-02-14
  • 1970-01-01
  • 1970-01-01
  • 2021-06-26
  • 1970-01-01
  • 1970-01-01
  • 2012-03-14
  • 2018-07-27
  • 2017-06-09
相关资源
最近更新 更多