[erlang-questions] Issue with my first program

Richard A. O'Keefe ok@REDACTED
Fri Sep 5 04:24:38 CEST 2008


On 5 Sep 2008, at 7:34 am, Timothy Baldridge wrote:
> -module(filemonitor).
> -export([start/1, dispatchloop/2]).

whatiswiththewordsruntogetherlikethis?
thatisevenhardertoreadthan BaStudlyCaps.

> dispatchloop([],Working) ->
>    Working;
> dispatchloop([H|T], Working) ->
>    if
> 	H == "#" ->
> 	    callcommand(Working),
> 	    dispatchloop(T, []);
> 	true ->
> 	    dispatchloop(T, Working)
>    end.

> 4> filemonitor:start("192.168.101.170").
> <<"getattr|/#">>
> ** exception exit: function_clause
>     in function  filemonitor:dispatchloop/2
>        called as filemonitor:dispatchloop(<<"getattr|/#">>,[])
>     in call from filemonitor:loop/2

It is telling you plainly that dispatchloop/2 was called
with the BINARY <<"getattr|/#">> as its first argument.
But dispatchloop wants a LIST as its first argument, so
no clause matched.  ('function_clause' really means
"[no] function clause [matched]".)

I also note that you never ever put anything into the
Working argument; all you ever do is to pass it along or
reset it to [].

I also note that you have interleaved >finding< the
commands and >processing< the commands.  When you are
getting started with something, it's often better to
keep things separate.

These three examples might be helpful:
1> regexp:split("foo#bar#ugh#", "#").
{ok,["foo","bar","ugh",[]]}
2> regexp:split("ick|ack||ugh", "|").
{ok,["ick","ack",[],"ugh"]}
3> binary_to_list(<<"getattr|/#">>).
"getattr|/#"




More information about the erlang-questions mailing list