server and state

As an exercise to test my understanding of sequential Erlang I wrote a simple-minded html tag editor.

It maintains a current position in the text, eg edit state, in a record like this:

-record(ed_txt, {a=[], b=[], c=[]).

...where a holds text above the current paragraph, b holds the current paragraph, and c holds text below the current paragraph.

It is called like this:

tag(App, FileName) ->
   {ok, File1} = get_file(App, FileName),
   {ok, File2} = file_to_paragraphs(File1),
   {ok, Record} = create_record(File2),
   ....

tag(Record) ->
   {ok, InputTuple} = get_input(Record), % gets edit command
   ...
   do(Command, Record)

The function do/2 is recursive function that looks like this:

   do("h", Record)    -> tag(help(Record));
   do("down", Record) -> tag(down(Record));
   do("up",Record)    -> tag(up(Record));
   do("h1", Record)   -> tag(wrap("H1", Record));
   ...
   do("quit", Record) -> {ok, quit(Record)};
   do(_, Record)      -> tag(Record).

Now I'd like to turn this module into an OTP gen-server, but realize that I don't really understand how to maintain state.

I created a state record:

-record(state, {app, filename, a=[], b=[], c=[]}).

My thought is to use a one-to-one supervisor so each user is working in his/her own process, ditch the edit loop, and use handle_call (or handle_cast) to call the respective edit functions.

But what confuses me is this:

As long as the process is running, presumably user state is maintained in the process, but both handle_call and handle_cast take State as a parameter and return State.

Does this mean that I also have to maintain state for each user OUTSIDE of their respective processes, in ets perhaps?

Or is there a better way to do this altogether?

Many thanks,

LRP

链接地址: http://www.djcxy.com/p/38252.html

上一篇: Erlang主管和主管孩子

下一篇: 服务器和状态