[erlang-questions] how to create user-defined guards

Jachym Holecek <>
Mon Apr 27 13:17:39 CEST 2009


# Ivan Carmenates Garcia 2009-04-27:
> get_students()->
>         F = fun()->
>                 mnesia:select(person_table, [{#person_table{
>                         id          ='$1',
>                         name     ='$2',
>                         group    ='$3',
>                         type      ='$4',
>                         id_card ='$5',
>                         user      ='$6'},
>                         [{'=:=', {is_student,'$4'}, true}],
>                         ['$_']}])
>         end,
>         mnesia:transaction(F).
> 
> is_student(X)->
>         if X == "Estudiante"->
>                 true;
>         true->
>                 false
>         end.
>
> [...]
> 
> How can I simulate or make my own guard or do something else to resolve this problem.

You can use arbitrary expressions in QLC queries; you could use the
following as transaction function (completely untested):

  F = fun () ->
              qlc:eval(qlc:q([Item || Item <- mnesia:table(person_table),
		is_person(Item)]))
      end

where is_person/1 is any Erlang function evaluating to boolean().

I don't know about QLC performance though and sure enough in a
simple case like yours you can just inline the is_student/1 test
into the matchspec and be done with it.

HTH,
	-- Jachym

PS: QLC needs -include_lib("stdlib/include/qlc.hrl").



More information about the erlang-questions mailing list