Commits

Anonymous committed 77fec91

.

  • Participants
  • Parent commits a365f9f

Comments (0)

Files changed (2)

       ]
     ;
 
+    type call 'i 'o = ('i * dest 'o)
+    ;
+
     value dest_put d v =
       match d with
       [ `Local f -> f v ]
       }
     ;
 
-    type server 'i 'o = process ('i * dest 'o);
+    type server 'i 'o = process (call 'i 'o);
 
     type process_group 'i = group_gen (process 'i);
     type server_group 'i 'o = group_gen (server 'i 'o);
     type dest 'o
     ;
 
+    (* вызов = аргументы + место для результата *)
+    type call 'i 'o = ('i * dest 'o)
+    ;
+
     (* тип не абстрактный, так как пока это самое простое для
        обеспечения возможности передавать синхронные вызовы другим
        процессам/серверам. *)
-    type server 'i 'o = process ('i * dest 'o)
+    type server 'i 'o = process (call 'i 'o)
     ;
 
+    (* переименовать в reply/replyto? *)
     value dest_put : dest 'o -> 'o -> IO.m unit
     ;
 
        но обёрнуто в абстрактный тип. *)
 
     type process_dispatcher 'i = process_context 'i -> ('i -> IO.m unit);
-    type server_dispatcher 'i 'o = server_context 'i 'o -> 'i -> IO.m 'o;
 
+    type server_dispatcher 'i 'o = server_context 'i 'o -> ('i -> IO.m 'o);
 
-    (*
-    для синхронных серверов предусмотреть что-то похожее на
-    gen_server:handler_call, по прикидкам упрощающее дело:
+    value create_process_group : unit -> IO.m (process_group 'i);
 
-    value gen_server : (gen_server_context 'i 'o -> ('i * caller) -> IO unit)
-       -> process_server 'i 'o
-
-         where gen_server_context 'i 'o =
-            < ! i2 . reply: caller 'o 'i2 -> 'o -> IO unit
-            ; me : process 'i 'o
-            ; ..   (* возможно send тоже надо, т.е. сделать это
-                      подтипом основного context;
-                      вроде бы, в эрланге это таки есть -- можно отвечать
-                      на сообщения не по порядку.  Или reply_to,
-                      оборачивающую ответ как надо. *)
-            >
-         and caller 'o 'i = (process 'o 'i * tag)
-
-      возможно стоит возвращать не process 'i 'o, а его подтип,
-      к которому будет позволено применять
-
-    value call : process_server 'i 'o -> 'i -> IO 'o;
-    *)
-
-
-    (* обеспечить мономорфность получающегося типа, чтобы в случае top-level
-       значений были конкретные типы. *)
-    value create_process_group : unit -> IO.m (process_group 'i);
-    value create_process : process_group 'i -> process_dispatcher 'i
-      -> IO.m (process 'i);
+    value create_process :
+      process_group 'i ->
+      process_dispatcher 'i ->
+      IO.m (process 'i);
 
     value create_server_group : unit -> IO.m (server_group 'i 'o);
+
     value create_server :
       server_group 'i 'o ->
       server_dispatcher 'i 'o ->
       IO.m (server 'i 'o);
 
     value send : process 'i -> 'i -> IO.m unit;
+
     value send_group : process_group 'i -> 'i -> IO.m unit;
 
     value call : server 'i 'o -> 'i -> IO.m 'o;
 
-
-    (* нужно конкретно для частной задачи, поэтому не уверен в ценности:
-       функция шлёт сообщения группе и дожидается ответа каждого из процессов
-       этой группы, затем возвращает массив ответов:
-
-    value call_group
-      : group 'i 'o -> 'i -> IO.m (array 'o);
-    (* если будет call, то можно будет выразить это как отсылку call-запросов
-      и приём call-ответов *)
-*)
-
-    (* ответы на сообщения будут производиться через передаваемый
-      в функцию контекст, где будут функции send для простых процессов
-      и reply для call-подобных. *)
+    value call_group : group 'i 'o -> 'i -> IO.m (array 'o);
 
   end
 ;