1

シーケンシャル Erlang の理解度をテストするための演習として、単純な html タグ エディターを作成しました。

テキスト内の現在の位置 (編集状態など) を次のようなレコードで維持します。

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

...ここで、a は現在の段落の上のテキストを保持し、b は現在の段落を保持し、c は現在の段落の下のテキストを保持します。

次のように呼び出されます。

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)

関数 do/2 は、次のような再帰関数です。

   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).

このモジュールを OTP 生成サーバーに変えたいのですが、状態を維持する方法がよくわからないことに気付きました。

状態レコードを作成しました:

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

私の考えでは、1 対 1 のスーパーバイザーを使用して、各ユーザーが自分のプロセスで作業し、編集ループを捨て、handle_call (または handle_cast) を使用してそれぞれの編集関数を呼び出すことです。

しかし、私を混乱させるのはこれです:

プロセスが実行されている限り、おそらくユーザー状態はプロセス内で維持されますが、handle_call と handle_cast の両方がパラメータとして State を取り、State を返します。

これは、おそらくetsで、それぞれのプロセスの外側にある各ユーザーの状態も維持する必要があることを意味しますか?

または、これを完全に行うためのより良い方法はありますか?

どうもありがとう、

LRP

4

0 に答える 0