列出Erlang中进程可用的可用记录

时间:2014-08-09 12:15:50

标签: erlang records

记录是编译时结构。 record_info和is_record识别已编译的记录及其结构。有没有办法向VM询问哪些记录已定义可用于该流程?我有兴趣获取每个记录定义的内部元组表示。

我想做的是:

-record(汽车,{作出=本田})。

get_record(Car) - >   %%有些魔法最终会像某样   {car,{make,honda}}甚至更好#car {}。当Car =' car'

时%%

3 个答案:

答案 0 :(得分:2)

正如你所说的记录只是一个编译时构造,所以一旦编译记录只是元组,这表明在运行时没有剩下可用的信息,但是既然你提到了这两个函数我很好奇,我检查了它们是如何工作的。

根据this record_info/2是一个仅在编译期间可用的伪函数,因此它不需要任何关于记录的运行时信息。

另一方面,is_record(Term, RecordTag)的描述表明,如果true是元组并且其第一个元素是,则此BIF(内置函数)仅“返回Term RecordTagfalse否则“,所以它实际上只是检查元组的结构和第一个元素。

基于此,我猜测在运行时没有可用的记录信息。 This thread确认运行期间record_info / 2不可用。

答案 1 :(得分:1)

我已经在我目前正在处理的其中一个应用程序的数据映射模块中成功使用了Dynarec(https://github.com/dieswaytoofast/dynarec.git)。它是一个解析变换器,但不是运行时VM工具。它编译有关每个已定义记录的信息,以及有关每个记录的字段的信息。就我而言,我用它来动态地将传入数据映射到记录数据。该模块可以满足您的需求。因人而异。祝你好运。

答案 2 :(得分:1)

正如其他人所说,记录纯粹是编译时间,并且没有关于记录的运行时信息。 Erlang只看到了元组。例如,record_info/2伪函数在编译时扩展为数据,fields参数的原子列表和size的整数。