auto-generated record access functions
ke han
ke.han@REDACTED
Mon May 29 16:08:42 CEST 2006
Ulf,
I've just tested your record access generator. I'm getting some errors.
I compile test.erl which is:
-module(test).
-compile({parse_transform, exprecs}).
-record(person, {firstName, lastName, birthDate}).
-export_records([person]).
compile results: (note, my erlc is a bash script which adds path,
includes and outputs in the correct places)
> erlc test.erl
using /Users/jhancock/bin/erlc
./test.erl:4: function '#new-person'/0 undefined
./test.erl:4: function '#set-person'/2 undefined
./test.erl:4: function '#get-person'/2 undefined
./test.erl:4: function '#info-person'/1 undefined
./test.erl:4: function '#new-person'/1 undefined
I just tried your exact example from the April 19 posting.
-module(test).
-compile({parse_transform, exprecs}).
-record(a, {a, b, c}).
-export_records([a]).
same type of errors.
any ideas?
thanks, ke han
On Apr 19, 2006, at 12:35 AM, Ulf Wiger ((AL/EAB)) wrote:
>
> I've written a small(-ish) parse transform that
> generates code for accessing exported records.
>
> I did read through ROK's abstract patterns proposal
> once more, but decided that it would be too much to
> try to implement _that_. The current hack does use
> function names that are somewhat similar to ROK's
> abstract patterns, but I don't think that will be a
> problem (mainly because I don't envision that anyone
> would use this stuff if the abstract patterns were
> available.)
>
> The idea is to use records as before, but for module-
> local use. For outside callers, records are 'exported'
> by including a -export_records([RecName]) directive.
> The following code extract illustrates the kind of
> code laid out by the parse_transform:
>
> -module(test).
> -compile({parse_transform, exprecs}).
> -record(a, {a, b, c}).
> -export_records([a]).
>
> %%% generated code
> -export(['#new-a'/0, '#new-a'/1,
> '#get-a'/2, '#set-a'/2,
> '#info-a'/1]).
>
> '#new-a'() -> #a{}.
> '#new-a'(Vals) -> '#set-a'(Vals, #a{}).
>
> '#get-a'(Attrs, R) when is_list(Attrs) ->
> ['#get-a'(A, R) || A <- Attrs];
> '#get-a'(a, R) -> R#a.a;
> '#get-a'(b, R) -> R#a.b;
> '#get-a'(c, R) -> R#a.c.
>
> '#set-a'(Vals, Rec) ->
> F = fun ([], R, _F1) -> R;
> ([{a, V} | T], R, F1) -> F1(T, R#a{a = V}, F1);
> ([{b, V} | T], R, F1) -> F1(T, R#a{b = V}, F1);
> ([{c, V} | T], R, F1) -> F1(T, R#a{c = V}, F1)
> end,
> F(Vals, Rec, F).
>
> '#info-a'(fields) -> record_info(fields, a).
>
> %%% end generated code
>
>
> A short shell dialogue to illustrate the use:
>
> Eshell V5.4.12 (abort with ^G)
> 1> test:'#new-a'().
> {a,undefined,undefined,undefined}
> 2> test:'#set-a'([{a,1},{c,3}], v(1)).
> {a,1,undefined,3}
> 3> test:'#set-a'([{b,2}], v(2)).
> {a,1,2,3}
> 4> test:'#get-a'(b, v(3)).
> 2
> 5> test:'#get-a'([a,c], v(3)).
> [1,3]
> 6> test:'#info-a'(fields).
> [a,b,c]
>
>
> Parse transformery attached. It's based on the stools_id_trans module
> that I posted a while back, but with improved error handling
> (controlled
> errors in the parse_transform module are reported as regular
> compilation
> errors.)
>
> BR,
> Ulf W
> <exprecs.erl>
More information about the erlang-questions
mailing list