Erlang запись в список кортежей - PullRequest
2 голосов
/ 21 января 2012

Я пытаюсь разработать макроопределение, которое превратит запись в список кортежей. Что-то вроде:

> Id = #id{id1=1,id2=2,id3=3}.
{id,1,2,3}
> ?record_to_tuplelist(id,Id).
[{id1,1},{id2,2},{id3,3}]

Пока я разработал это:

-define(record_to_tuplelist(Rec,RecRef), [ {X,RecRef#Rec.X} || X <- record_info(fields,Rec) ]).

Но это дает синтаксическую ошибку. Если я изменяю RecRef # Rec.X на RecRef # Rec {}, это работает, но не возвращает то, что я хочу. Это просто неясная синтаксическая ошибка или это на самом деле невозможно?

1 Ответ

7 голосов
/ 21 января 2012

Нет, как имя записи, так и имена полей должны быть атомами.Как насчет чего-то вроде (не проверено):

-define(record_to_tuplelist(Rec, Ref), lists:zip(record_info(fields, Rec),tl(tuple_to_list(Ref)))).
...