Record selectors

Chris Pressey cpressey@REDACTED
Fri Jan 3 12:15:26 CET 2003


On Thu, 2 Jan 2003 18:50:14 +0100
"Daniel Dudley" <daniel.dudley@REDACTED> wrote:

> I'm curious as to why it is necessary to specify the record
> name when selecting a record instance bound to a variable,
> i.e., Variable#RecordName.Field.

Because Erlang is a dynamically-typed language.  In a dynamically-typed
language, values have types, but variables do not.

> Using an example from the
> Erlang Extensions document, but following good programming
> practice by using a meaningful variable name, we have:
> 
>     > Person = #person{name = "Joe", [0,8,2,3,4,3,1,2]}.
>     {person, "Joe", [0,8,2,3,4,3,1,2], undefined}
>     > Person#person.name.
>     "Joe"
> 
> Since the Person variable is bound to an instance of person
> records, it seems to me that it should be possible to use
> syntax like one of the following examples to retrieve field
> data (and avoid duplicity and unnecessary keyboard typing
> in the code):
> 
> 1)  > Person#.name
> 2)  > Person#name
> 3)  > Person.name

But consider the case of there being another record definition with a
field called 'name', e.g. Country#country.name.  If one were then to write
a function like

  print_name(X) -> io:fwrite("~p~n", [X#name]).

There is no way for the compiler to infer what field #name refers to.

The practical recourse at the moment, at least for me, is:
a) if performance is critical, use records and accept the silly syntax
b) if flexibility is more important, use dictionaries

Quite often I find myself wrapping record accesses in functions, although
"person:name(X)" is just as verbose as "X#person.name" (in fact it's one
character longer :) but it looks nicer, plus it abstracts the access so
that e.g. person:name(X) could be derived from X#person.first_name and
X#person.last_name at some future point in development.  Again, if
performance is critical, this sort of thing should still be avoided,
because unlike "X#person.name", you can't tell what the complexity of
"person:name(X)" is just by looking at it.

-Chris



More information about the erlang-questions mailing list