[erlang-questions] questions about dict

Joe Armstrong <>
Tue Aug 21 20:05:09 CEST 2007


You could put the dictionary in a record and test for the record :-)

Define dict.hrl

--- dict.hrl ---
-record(dict,{val}).

--- my_dict.erl ---

-module(my_dict).

-record(dict, {val}).
-export([new/0, store/3, find/2]).

new() ->
    #dict{val=dict:new()}.

store(Key, Val, Dict) ->
    #dict{val=dict:store(Key, Val, Dict#dict.val)}.

find(Key, Dict) ->
    dict:find(Key, Dict#dict.val).

Use can use my_dict.erl just as you would use dict

--- test1.erl ---

-module(test1).

-compile(export_all).

-include("dict.hrl").

test() ->
    D  = my_dict:new(),
    D1 = my_dict:store(name,joe,D),
    foo(D1).

foo(X) when is_record(X, dict) ->    %% This is how to fake a guard
    my_dict:find(name, X).

etc ...

If you *really* want to fake it up as a guard

The more "erlangy" way is to add a wrapper and use pattern matching:

foo({dict, X}) -> ...

the tuple {dict, X} is used *everywhere* in the code to
signal the fact that X is an instance of a dictionary - then you
just pattern match on {dict, X}

/Joe Armstrong

On 21 Aug 2007 09:27:49 +0200, Bjorn Gustavsson <> wrote:
> Dustin Sallings <> writes:
>
> >
> > >>    2)  I can't seem to make a guard for a dict because the record
> > >> format is unavailable to me at compile time (I'm working around this
> > >> by matching tuple and hard-coding a tuple pattern for identifying a
> > >> dict).
> > >
> > > That is intentional (and even mentioned in the documentation).
> > >
> > > There is no portable way to test for a dict in a guard.
> >
> >       Where is this documented?  I looked around for a while and
> > couldn't  find anything either way.  There's clearly a gap in my
> > understanding  of guards, records, or dicts.
>
> It may be a little subtle, but the documentation for dict says:
>
>  "Dict implements a Key - Value dictionary. The representation of a dictionary is not defined."
>
> That means that only the dict module knows about how a dictionary is represented,
> and that you should only use the functions in the dict module to access a dictionary.
>
> If you use knowledge gained from looking at the source of dict to write a guard
> test any, your code could in principle stop to work in a future release of OTP if
> we change the representation.
>
> /Bjorn
>
> --
> Björn Gustavsson, Erlang/OTP, Ericsson AB
> _______________________________________________
> erlang-questions mailing list
> 
> http://www.erlang.org/mailman/listinfo/erlang-questions
>



More information about the erlang-questions mailing list