[erlang-questions] Beginner question

Pietro pulsarpietro@REDACTED
Tue Mar 15 21:28:14 CET 2016


dmkolesnikov@REDACTED writes:

> Hello,
>
> You are using atoms instead of variables in your program. Erlang
> variables starts with capital letter.
>
> The receive loop cannot match your message:
>
>     {From, {insert, key, value}} ->
>
> It expects one triple of atoms but you send different one.
>
>     test:interact(Pid, {insert, testkey, testvalue}).
>
> Dmitry
>
> Sent from my iPhone
Ouch ! Thank you very much, I knew I were missing something crucial
here, would you help me in my next step ?

loop(Table) ->
    receive
	{From, {insert, Key, Value}} ->
	    io:format("Here insert"),
	    Return = ets:insert(Table, {Key, Value}),
	    From ! Return,
	    loop(Table);
	{From, {lookup, Key}} ->
	    io:format("Here lookup"),
	    Return = ets:lookup(Table, Key),
	    From ! Return,
	    loop(Table);
	{From, Any} ->
	    From ! {self(), {error,Any}},
	    loop(Table)
    end.

This code results in :

1> c(test).
{ok,test}
2> Pid = test:start().
<0.40.0>
3> Pid ! {self(), {insert, a, 1}}.
Here insert{<0.33.0>,{insert,a,1}}
4> Pid ! {self(), {lookup, a}}.
Here lookup{<0.33.0>,{lookup,a}}


It does not return the the stored values even though it clearly matches
the patterns, where is the rub here ?


>
> On 15 Mar 2016, at 00:53, Pietro <pulsarpietro@REDACTED> wrote:
>
>     Hi all,
>     
>     I have recently started to implement a small academic project in
>     Erlang
>     and I have bumped into a problem which seems to show to myself I
>     haven't
>     grasped something important about the technology itself.
>     
>     That's my code :
>     
>     -module(test).
>     -export([start/0, interact/2]).
>     
>     
>     start() ->
>     spawn (fun() -> startloop() end).
>     
>     
>     interact(Pid, Request) ->
>     Pid ! {self(), Request},
>     receive 
>     {Pid, Response} -> Response
>     end.
>     
>     
>     startloop() ->
>     TableId = ets:new(dictionary, [set]),
>     loop(TableId).
>     
>     loop(Table) ->
>     receive
>     {From, {insert, key, value}} ->
>     From ! ets:insert(Table, {key, value}),
>     loop(Table);
>     {From, {lookup, key}} ->
>     From ! ets:lookup(Table, key),
>     loop(Table);
>     Any ->
>     Any
>     
>     end.
>     
>     
>     The problem happens when I try to interact with the server I start
>     using
>     the command:
>     
>     Pid = test:start().
>     
>     Then I run :
>     
>     test:interact(Pid, {insert, testkey, testvalue}).
>     
>     My ershell at this point hangs and nothing happens ... what is
>     happening
>     ? Please feel free to redirect me to a more appropriate newsgroup
>     if my
>     question is not appropriate or if there is a better one.
>     
>     Thanks in advance.
>     
>     Pietro.
>     
>     _______________________________________________
>     erlang-questions mailing list
>     erlang-questions@REDACTED
>     http://erlang.org/mailman/listinfo/erlang-questions
>     




More information about the erlang-questions mailing list