Records are tuples with the record name as first element and the rest of the fields in order exactly like "normal" Erlang records. As with Erlang records the default default value is 'undefined.

(defrecord name
  (field default-value)
  ... )

The record defined above will create access functions/macros for creation and access fields. The make, match and set forms takes optional argument pairs field-name value to get non-default values. E.g. for the record:

(defrecord person
  (name '"")
  (address '"")

We have:

  • (make-person {{field value}} ... )
  • (match-person {{field value}} ... )
  • (is-person r)
  • (fields-person)
  • (emp-person {{field value}} ... )
  • (set-person r {{field value}} ... )
  • (person-name r)
  • (person-name)
  • (set-person-name r name)
  • (person-age r)
  • (person-age)
  • (set-person-age r age)
  • (person-address r)
  • (set-person-address r address)


(make-person name "Robert" age 54)

Will create a new person record with the name field set to "Robert", the age field set to 54 and the address field set to the default "".

(match-person name name age 55)

Will match a person with age 55 and bind the variable name to the name field of the record. Can use any variable name here.

(is-person john)

Test if john is a person record.

(emp-person age '$1)

Create an Ets Match Pattern for record person where the age field is set to $1 and all other fields are set to _.

(person-address john)

Return the address field of the person record john.


Return the index of the address field of a person record.

(set-person-address john '"back street")

Sets the address field of the person record john to "back street".

(set-person john age 35 address '"front street")

In the person record john set the age field to 35 and the address field to "front street".


Returns a list of fields for the record. This is useful for when using LFE with Mnesia, as the record field names don't have to be provided manually in the create_table call.