j'ai écrit un code il y a un moment qui fusionne deux enregistrements est pas tout à fait dynamique, mais cinque macros vous pouvez facilement l'utiliser pour plusieurs enregistrements
Il fonctionne comme ceci:.. La fonction de fusion/2 prend deux enregistrements et les convertit en listes avec l'enregistrement vide à titre de référence (le type d'enregistrement est défini au moment de la compilation, et doit être.) Il s'agit de la partie "non dynamique". avec des listes et prend des éléments de A si elles sont définies, sinon de B si elles sont définies, ou enfin de Default (qui est toujours défini)
Voici le code (excusez le pauvre Erlang de StackOverflow coloration syntaxique):
%%%----------------------------------------------------------------------------
%%% @spec merge(RecordA, RecordB) -> #my_record{}
%%% RecordA = #my_record{}
%%% RecordB = #my_record{}
%%%
%%% @doc Merges two #my_record{} instances. The first takes precedence.
%%% @end
%%%----------------------------------------------------------------------------
merge(RecordA, RecordB) when is_record(RecordA, my_record),
is_record(RecordB, my_record) ->
list_to_tuple(
lists:append([my_record],
merge(tl(tuple_to_list(RecordA)),
tl(tuple_to_list(RecordB)),
tl(tuple_to_list(#my_record{})),
[]))).
%%%----------------------------------------------------------------------------
%%% @spec merge(A, B, Default, []) -> [term()]
%%% A = [term()]
%%% B = [term()]
%%% Default = [term()]
%%%
%%% @doc Merges the lists `A' and `B' into to a new list taking
%%% default values from `Default'.
%%%
%%% Each element of `A' and `B' are compared against the elements in
%%% `Default'. If they match the default, the default is used. If one
%%% of them differs from the other and the default value, that element is
%%% chosen. If both differs, the element from `A' is chosen.
%%% @end
%%%----------------------------------------------------------------------------
merge([D|ATail], [D|BTail], [D|DTail], To) ->
merge(ATail, BTail, DTail, [D|To]); % If default, take from D
merge([D|ATail], [B|BTail], [D|DTail], To) ->
merge(ATail, BTail, DTail, [B|To]); % If only A default, take from B
merge([A|ATail], [_|BTail], [_|DTail], To) ->
merge(ATail, BTail, DTail, [A|To]); % Otherwise take from A
merge([], [], [], To) ->
lists:reverse(To).
N'hésitez pas à l'utiliser comme bon vous semble.
Un coup d'œil rapide sur ce n'est peut-être pas exactement ce que je cherchais. Mais intéressant néanmoins et quelque chose que je vérifierai plus tard. –