Small Erlang bencode library

Ulf Wiger (AL/EAB) <>
Thu May 18 11:11:27 CEST 2006

Steve Smith wrote:
> [...]
> > bencode(Dict) when element(1, Dict) == dict -> 
> >         Sorter = fun({Key1, _}, {Key2, _}) -> Key1 < Key2 end,
> >         Pairs = [[bencode(Key), bencode(Value)] || {Key, Value} <- 
> > lists:sort(Sorter, dict:to_list(Dict))],
> >         [$d, Pairs, $e].
> My original version of the code used is_integer(), etc, but I 
> had to move to tuples when I realised there's no reliable way 
> to detect if a list is a string or not.

Yes, this is a bit tricky.

Joe Armstrong has played with the following convention in the past (e.g.
in his UBF implementation):

s(Str) -> {'#S', Str}.
-define(S(Str), {'#S',Str}).

start(Nick) ->
    {reply,{ok,_}, _} = rpc(Pid, {startService, s("irc_server"), []}),
    case rpc(Pid, {nick, s(Nick)}) of
        {reply, false, _} ->
        {reply, true, active} ->

handlerRpc(active, {nick, ?S(New)}, Nick, Manager) ->
    case ask_manager(Manager, {change_nick,Nick,New,self()}) of
        ok ->
            {true, active, New};
        error ->
            {false, active, Nick}

Basically, s(string()) constructs a string object, and ?S(Str)
matches on the string value.

>  I didn't know about the "element(1, Dict) == dict"
> trick either, that's useful.  

... but a violation of the common convention that you don't peek into
undocumented data structures, just because you can. :)

I was going to suggest that you use orddict instead of dict, partly to
eliminate the need for sorting.
Also, I'd stick with the tagging.

> Has anyone ever looked at adding stronger typing to Erlang 
> (*strong*, not static :), eg. the ability to define new types 
> that are checkable at runtime?  At the moment it looks like 
> people are adding their own ad-hoc typing via tagged-tuples 
> (although matching makes this much less messy that it could be).

There have been several attempts at adding typing to Erlang. The success
of Dialyzer has changed the landscape quite a bit, since dealing with
types in Erlang is suddenly almost comme il faut.

Ulf W

More information about the erlang-questions mailing list