That would be a great solution!<div><br></div><div><br><div class="gmail_quote">On Tue, Nov 22, 2011 at 5:54 PM, Ulf Wiger <span dir="ltr"><<a href="mailto:ulf@wiger.net">ulf@wiger.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="im"><br>
On 22 Nov 2011, at 08:49, Barco You wrote:<br>
<br>
> So, that's to say we have to manually change the code_change callback whenever we update the state record?<br>
> It seems to disobey the spirit of simple maintenance by taking the advantage of erlang record.<br>
<br>
</div>A feature of 'exprecs' which hasn't been documented, is that it can provide a conversion function for old records.<br>
<br>
See for example:<br>
<br>
<a href="https://github.com/uwiger/parse_trans/blob/master/examples/test_exprecs_vsns.erl" target="_blank">https://github.com/uwiger/parse_trans/blob/master/examples/test_exprecs_vsns.erl</a><br>
<br>
This is the output when running it:<br>
<br>
Eshell V5.8.4  (abort with ^G)<br>
1> test_exprecs_vsns:f().<br>
'#info-r'(fields) -> [a,b,c]<br>
'#info-r__1_1'(fields)' -> [a,b,c,d] (not exported)<br>
'#info-r__1_2'(fields)' -> [a,b] (not exported)<br>
'#convert-'("1_1", {r,1,2,3,4}) -> {{r,1,2,3},[{d,4}]}<br>
'#convert-'("1_1", {r,1,2,3,4}) -> {{r,1,2,undefined},[]}<br>
ok<br>
<br>
The idea, then, is that old versions of a record definition are kept, and renamed with a version suffix (separated from the record name with two underscores).<br>
<br>
Exprecs will then automatically generate a '#convert-'/2 function, which takes an old record and converts it to the latest definition (the one with no version suffix).<br>
<br>
If the old record had more fields than the current, those values are returned as a proplist beside the new record. If the old record had fewer fields, default values are inserted as usual.<br>
<br>
Note that those old records are expected to have the normal record tag ('r', in the case above) - not the tag with a version suffix.<br>
<br>
BR,<br>
Ulf W</blockquote></div><br></div>