[BACK]Return to stackmachine.tex CVS log [TXT][DIR] Up to [local] / OpenXM / doc / OpenXM-specs

Diff for /OpenXM/doc/OpenXM-specs/stackmachine.tex between version 1.2 and 1.14

version 1.2, 2000/01/21 06:24:49 version 1.14, 2020/03/14 01:21:56
Line 1 
Line 1 
 //&jp \section{ OX スタックマシン }  %%  $OpenXM: OpenXM/doc/OpenXM-specs/stackmachine.tex,v 1.13 2016/08/22 09:08:50 takayama Exp $
 //&eg \section{ OX stackmachine }  (This section has not yet been translated.)  //&jp \section{ OX 鴻帥激 }
   //&eg \section{ OX stack machine }
   \label{sec:stackmachine}
 /*&jp  /*&jp
 この節では, OX スタックマシン operator の説明  膀с, OX 鴻帥激 operator 茯
 (TCP/IP ソケット上での標準 encoding 法 を用いる),  (TCP/IP 純宴筝с罔羣 encoding 羈 ),
 および, サンプルサーバとリンクする場合または  , 泣潟泣若潟翫障
 open XM ライブラリとしてリンクして使用する場合の  open XM ゃ潟篏睡翫
 ための C の関数の仕様を説明する.   C ∽違篁罕茯.
   
 説明の前に, OX サーバスタックマシンの動作の原則を  茯, OX 泣若鴻帥激潟篏
 説明しておく.  茯.
 サーバスタックマシンは,  泣若鴻帥激潟,
 {\tt SM\_pop*} 系のスタックマシンコマンドがこないかぎり,  {\tt SM\_pop*} 膤祉鴻帥激潟潟潟,
 自発的にメッセージを送信することはない.  榊<祉若吾篆<.
 この原則に基づいて分散計算のプログラミングをおこなう.  冴ャh膊違潟違.
 イベントドリブンなプログラム法とはちがうことに  ゃ潟潟違羈<
 注意しよう.  羈.
 */  */
   
 /*&eg  /*&eg
Line 27  commands.  Note that the programming style should be d
Line 28  commands.  Note that the programming style should be d
 that for event-driven programming.  that for event-driven programming.
 */  */
   
 //&jp \subsection{サーバスタックマシン }  //&jp \subsection{泣若鴻帥激 }
 //&eg \subsection{Server stack machine}  //&eg \subsection{Server stack machine}
   
 /*&jp  /*&jp
 サンプルサーバである {\tt oxserver00.c}  泣潟泣若с {\tt oxserver00.c}
 は以下の仕様の C の関数を用意して,  篁ヤ篁罕 C ∽違,
 {\tt nullstackmachine.c } を置き換えれば一応動作するはずである.  {\tt nullstackmachine.c } 臀遺綽篏с.
 */  */
 /*&eg  /*&eg
 {\tt oxserver00.c} is implemented as a sample server.  {\tt oxserver00.c} is implemented as a sample server.
 If you want to implement you own server,  If you want to implement you own server,
 write the following functions and use them instead of  write the following functions and use them instead of
 those in {\tt nullstackmachine.c }.  those in {\tt nullstackmachine.c}.
 */  */
   
 //&jp \subsubsection{サーバスタックマシンのグループ SMobject/Basic0 に属するオペレータ}  //&jp \subsubsection{泣若鴻帥激潟違若 SMobject/Primitive 絮若}
 //&eg \subsubsection{Operators in the group SMobject/Basic0}  //&eg \subsubsection{Operators in the group SMobject/Primitive}
   
 /*&jp  /*&jp
 \noindent  \noindent
 サーバスタックマシンは最低で1本のスタック  泣若鴻帥激潟篏1鴻帥
 \begin{verbatim}  \begin{verbatim}
 Object xxx_OperandStack[SIZE];  Object xxx_OperandStack[SIZE];
 \end{verbatim}  \end{verbatim}
 をもつ.  ここで, {\tt Object} はそのシステム固有の Object 型で構わない.  .  , {\tt Object} 激鴻堺 Object ф.
 CMObject は各サーバ固有のローカルオブジェクトに変換してスタックへプッ  CMObject 泣若堺若吾с紊鴻帥吾
 シュしてよい.  ただし変換, 逆変換を合成したものは恒等写像であることが  激ャ.  紊, 紊膈с
 のぞましい.  CMObject をどのように (local) Object に変換するか, Object  障.  CMObject (local) Object 紊, Object
 が受け付けるメッセージの定義は,各システムが独自にきめて文書化しておく  篁<祉若吾絎臂,激鴻後
 ものとする.  つまりすべてのメッセージは, private である.  たとえば,  .  ゃ障鴻<祉若吾, private с.  ,
 {\tt add } のような基本的な メッセージにたいしても, OX スタックマシン  {\tt add } 堺 <祉若吾, OX 鴻帥激
 はなにもきめていない.  将来的には open math \cite{openmath} のように  .  絨ョ open math \cite{openmath}
 CMObject に対する最大公約数的なメッセージの仕様をcontent dictionary  CMObject 絲障紊у膣亥<祉若吾篁罕content dictionary
 (CD) の形で定義したい.  (CD) 綵≪у臂.
   
 以下, \verb+ xxx_ + は誤解の恐れがないときは省略する.  篁ヤ, \verb+ xxx_ + 茯よВャ.
 \verb+ xxx_ + は local サーバシステムに固有の識別子である.  \verb+ xxx_ + local 泣若激鴻堺茘ュс.
 {\tt Asir} の場合は \verb+ Asir_ + を用いる.  {\tt kan/sm1} の場合は  {\tt Asir} 翫 \verb+ Asir_ + .  {\tt kan/sm1} 翫
 \verb+ Sm1_ + を用いる.  関数名, タグ名は長いので省略形を用いてもよい.  \verb+ Sm1_ + .  ∽医, 帥医激хュ就.
   
 以下では次のようにパケットを記述する.  各フィールドは,  篁ヤс罨<宴荐菴違.  c若,
 \fbox{データ型 \quad  データ} なる形式  \fbox{若水 \quad  若} 綵√
 で書く.  たとえば, {\tt int32 OX\_DATA} は 32 bit network byte order  ф吾.  , {\tt int32 OX\_DATA} 32 bit network byte order
 の数字 {\tt OX\_DATA}という意味である.  ``イタリックで書かれているフィー  医 {\tt OX\_DATA}潟с.  ``ゃ帥ф吾c
 ルドは,定義が別のところでなされているか解釈に誤解のないような自然言語  ,絎臂ャс茹i茯よВ区茯
 で説明されている object を表す.''  たとえば, {\it String commandName}  ц object 茵.''  , {\it String commandName}
 は, String データ型の local object {\it commandName} を意味する.  (サー  , String 若水 local object {\it commandName} 潟.  (泣
 バスタックマシン上の object は, CMO 形式の objectとは限らないことに注  鴻帥激割 object , CMO 綵√ object羈
 意.  CMO 形式で書いてあっても, それはサーバスタックマシンのlocal 形式  .  CMO 綵√ф吾c, 泣若鴻帥激潟local 綵√
 でスタック上にあると解釈して下さい.)  с鴻帥筝茹i筝.)
   
 すべてのサーバスタックマシンは以下の関数を実装していないといけない.  鴻泣若鴻帥激潟篁ヤ篏絎茖.
   篏絲障, 緇鴻帥倶腓冴. 潟,
   勆吾с鴻帥絲上.
 */  */
   
 /*&eg  /*&eg
Line 89  Object xxx_OperandStack[SIZE];
Line 92  Object xxx_OperandStack[SIZE];
 \end{verbatim}  \end{verbatim}
 Here {\tt Object} may be local to the system {\tt xxx} wrapped by the stack  Here {\tt Object} may be local to the system {\tt xxx} wrapped by the stack
 machine.  machine.
 That is, the server may translate CMObjects into local its  That is, the server may translate CMObjects into its local
 objects and push them onto the stack.  However, it is preferable that  objects and push them onto the stack.  It is preferable that
 the composition of such a translation and its inverse is equal to the  the composition of such a translation and its inverse is equal to the
 identity map. The translation scheme is called the phrase book of the  identity map. The translation scheme is called the {\it phrase book} of the
 server and it should be documented for each stack machine.  In OpenXM,  server and it should be documented for each stack machine.  In OpenXM,
 any message is private.  In future we will provide a content  any message is private to a connection.  In future we will provide a content
 dictionary (CD; see OpenMath \cite{openmath}) for basic specifications  dictionary (CD; see OpenMath \cite{openmath}) for basic specifications
 of CMObjects.  of CMObjects.
   
 In the following, \verb+ xxx_ + may be omitted if no confusion occurs.  In the following, \verb+ xxx_ + may be omitted if no confusion occurs.
 As the names of functions and tags are long, one may use abbreviated  As the names of functions and tags are long, one may use abbreviated
 names.  Message packets are represented as follows.  Each field is  names.  Message packets are represented as follows.
 shown as \fbox{data type \quad data}.  For example {\tt int32  
 OX\_DATA} denotes a number {\tt OX\_DATA} which is represented by a 32  
 bit network byte order.  If a field is displayed by italic characters,  
 it should be defined elsewhere or its meaning should be clear.  For  
 example {\it String commandName} denotes a local object {\it  
 commandName} whose data type is String.  Note that an object on the  
 stack may have a local data type even if it is represented as CMO.  
   
   Each field is shown as \fbox{data type \quad data}.  For example {\tt
   int32 OX\_DATA} denotes a number {\tt OX\_DATA} which is represented
   by a 32 bit integer with the network byte order.  If a field is
   displayed by italic characters, it should be defined elsewhere or its
   meaning should be clear.  For example {\it String commandName} denotes
   a local object {\it commandName} whose data type is String.  Note that
   an object on the stack may have a local data type even if it is
   represented as CMO.
   
 Any server stack machine has to implement the following operations.  Any server stack machine has to implement the following operations.
   For each operation we show the states of the stack before and after
   the operation. In the figures the rightmost object corresponds to the
   top of the stack. Only the modified part of the stack are shown.
 */  */
   
 \begin{enumerate}  \begin{enumerate}
 \item  \item
 /*&jp  /*&jp
 CMObject/Basic0 の CMO データのうち必須のもの, {\tt CMO\_ERROR2}, {\tt  CMObject/Primitive CMO 若帥≦, {\tt CMO\_ERROR2}, {\tt
 CMO\_NULL}, {\tt CMO\_INT32}, {\tt CMO\_STRING}, {\tt CMO\_LIST}がおく  CMO\_NULL}, {\tt CMO\_INT32}, {\tt CMO\_STRING}, {\tt CMO\_LIST}
 られて来た場合それをスタックに push する.  たとえば, {\tt CMO\_NULL}  ャ翫鴻帥 push .  , {\tt CMO\_NULL}
 あるいは {\tt CMO\_String} の場合次のようになる.   {\tt CMO\_String} 翫罨<.
 */  */
 /*&eg  /*&eg
 Any server should accept CMObjects in the group CMObject/Basic0.  Any server should accept CMObjects in the group CMObject/Primitive.
 The server pushes such data onto the stack.  The server pushes such data onto the stack.
 The following examples show the states of the stack after receiving  The following examples show the states of the stack after receiving
 {\tt CMO\_NULL} or {\tt CMO\_String} respectively.  {\tt CMO\_NULL} or {\tt CMO\_String} respectively.
Line 139  Stack after the request:
Line 147  Stack after the request:
 \hline  \hline
 \end{tabular}  \end{tabular}
   
 //&jp Result:  なし.  Output:  none.
 //&eg Result:  none.  
   
 Request:  Request:\\
 \begin{tabular}{|c|c|c|c|c|c|}  \hline  \begin{tabular}{|c|c|c|c|c|c|}  \hline
 {\tt int32 OX\_DATA} & {\tt int32 CMO\_String} &{\tt int32} {\rm size}  {\tt int32 OX\_DATA} & {\tt int32 CMO\_String} &{\tt int32} {\rm size}
 &{\tt byte} {\rm s1} & $\cdots$ &{\tt byte} {\rm ssize}\\  &{\tt byte} {\rm s1} & $\cdots$ &{\tt byte} {\rm ssize}\\
Line 155  Stack after the request:
Line 162  Stack after the request:
 \hline  \hline
 \end{tabular}  \end{tabular}
   
 //&jp Result:  なし.  Output:  none.
 //&eg Result:  none.  
   
 //&jp CMO データの受け取りに失敗した時のみ  \\  //&jp CMO 若帥紊掩  \\
 //&eg If the server fails to receive a CMO data,  //&eg If the server fails to receive a CMO data,\\
 \begin{tabular}{|c|c|c|}  \hline  \begin{tabular}{|c|c|c|}  \hline
 {\tt int32 OX\_DATA} & {\tt int32 CMO\_ERROR2} & {\it CMObject} ob\\  {\tt int32 OX\_DATA} & {\tt int32 CMO\_ERROR2} & {\it CMObject} ob\\
 \hline  \hline
 \end{tabular}  \end{tabular}
 \\  \\
 /*&jp  /*&jp
 をスタックへ push する.  鴻帥 push .
 現在のところ, ob には, \\  憜, ob , \\
 \centerline{  \centerline{
 [{\sl Integer32} OX パケット番号, {\sl Integer32} エラー番号,  [{\sl Integer32} OX 宴, {\sl Integer32} 主,
 {\sl CMObject} optional 情報]  {\sl CMObject} optional ]
 }  }
 なるリストを入れる (CMO 形式でかいてあるが, これはサーバ独自の形式でよい.  鴻ャ (CMO 綵√с, 泣若綵√с.
 CMO として送出されるときこのような形式でないといけないという意味である.)  CMO 冴綵√с潟с.)
 */  */
 /*&eg  /*&eg
 is pushed onto the stack.  is pushed onto the stack.
Line 189  Currently ob is a list\\
Line 195  Currently ob is a list\\
 SM_mathcap  SM_mathcap
 \end{verbatim}  \end{verbatim}
 /*&jp  /*&jp
 このサーバの mathcap をもどす (termcap のまね).  サーバのタイプ, サー  泣若 mathcap (termcap 障).  泣若帥ゃ, 泣
 バスタックマシンの能力を知ることができる.  C 言語で実装する場合は,  鴻帥激潟遵ャс.  C 荐茯у茖翫,
 mathCap の構造体をシステム毎にきめるものとし,この関数はその構造体への  mathcap 罕篏激鴻罸,∽違罕篏吾
 ポインタを戻す.  (open sm1 では {\tt struct mathCap} を用いている.  ゃ潟帥祉.  (open sm1 с {\tt struct mathcap} .
 */  */
 /*&eg  /*&eg
 It request to push the mathcap of the server.  It requests a server to push the mathcap of the server.
 The mathcap is similar to the termcap. One can know the server type  The mathcap is similar to the termcap. One can know the server type
 and the capability of the server from the mathcap.  and the capability of the server from the mathcap.
 */  */
Line 207  Request:
Line 213  Request:
 \hline  \hline
 \end{tabular}  \end{tabular}
   
 Result:  Stack after the request:
 \begin{tabular}{|c|c|}  \hline  \begin{tabular}{|c|c|}  \hline
 {\tt int32 OX\_DATA} & {\sl Mathcap}  mathCapOb \\  {\tt int32 OX\_DATA} & {\sl Mathcap}  mathCapOb \\
 \hline  \hline
 \end{tabular}  \end{tabular}
   
   Output: none.
   
 \item  \item
 \begin{verbatim}  \begin{verbatim}
 SM_setMathCap  SM_setMathcap
 \end{verbatim}  \end{verbatim}
 /*&jp  /*&jp
 受け取った Mathcap {\tt m} を自分のシステムに設定して, 相手側が理解不  c Mathcap {\tt m} 激鴻荐絎, 御眼茹d
 能な CMO をおくらないようにする.  C 言語で実装する場合は, mathCap の構  純 CMO .  C 荐茯у茖翫, mathcap 罕
 造体をシステム毎にきめるものとし,この関数はその構造体へのポインタを引  篏激鴻罸,∽違罕篏吾ゃ潟帥綣
 数とする.  (open sm1 では {\tt struct mathCap} を用いている.  違.  (open sm1 с {\tt struct mathcap} .
 */  */
 /*&eg  /*&eg
 It requests to register the peer's mathcap {\tt m} in the server.  It requests a server to register the peer's mathcap {\tt m} in the server.
 The server can avoid to send OX messages unknown to its peer.  The server can avoid to send OX messages unknown to its peer.
 */  */
 @plugin/mathcap.h)  @plugin/mathcap.h)
   
   Stack before the request:
   \begin{tabular}{|c|}  \hline
   {\it Mathcap m}  \\
   \hline
   \end{tabular}\\
 Request:  Request:
 \begin{tabular}{|c|c|}  \hline  \begin{tabular}{|c|c|}  \hline
 {\tt int32 OX\_DATA} & {\sl Mathcap} m  \\ \hline  {\tt int32 OX\_DATA} & {\sl Mathcap} m  \\ \hline
 {\tt int32 OX\_COMMAND} & {\tt int32 SM\_setMathCap}  \\  {\tt int32 OX\_COMMAND} & {\tt int32 SM\_setMathcap}  \\
 \hline  \hline
 \end{tabular}  \end{tabular}
   
 //&jp Result:  なし. \\  Output:  none.
 //&eg Result:  none. \\  
 /*&jp  /*&jp
 \noindent  \noindent
 注意: mathcap は一般にクライアント主体で設定する.  羈: mathcap 筝ゃ≪潟筝私ц┃絎.
 クライアントがサーバに {\tt SM\_mathcap} をおくり,  ゃ≪潟泣若 {\tt SM\_mathcap} ,
 サーバ側の mathcap を得る.  泣若眼 mathcap 緇.
 それを, クライアントはそのサーバに付随した mathcap として  , ゃ≪潟泣若篁 mathcap
 設定する.  荐絎.
 次に, クライアントはサーバに自分の mathcap を  罨<, ゃ≪潟泣若 mathcap
 {\tt SM\_setMathCap} でおくり, 自分の mathcap を設定させる.  {\tt SM\_setMathcap} с, mathcap 荐絎.
 */  */
 /*&eg  /*&eg
 \noindent  \noindent
 Remark: In general the exchange of mathcaps is triggered by a client.  Remark: In general the exchange of mathcaps is triggered by a client.
 A client sends {\tt SM\_mathcap} to a server and obtains the server's  A client sends {\tt SM\_mathcap} to a server and obtains the server's
 mathcap. Then the client registers the mathcap. Finally the client  mathcap. Then the client registers the mathcap. Finally the client
 sends its own mathcap by {\tt SM\_setMathCap} and the server  sends its own mathcap by {\tt SM\_setMathcap} and the server
 registers it.  registers it.
 */  */
   
Line 262  registers it.
Line 274  registers it.
 SM_executeStringByLocalParser  SM_executeStringByLocalParser
 \end{verbatim}  \end{verbatim}
 /*&jp  /*&jp
 文字列 $s$ をシステム xxx の文法(サーバスタックマシンの組み込みローカ  絖 {\tt s} stack pop ,
 ル言語)にしたがったコマンドとして実行する.  ただし, コマンドの実行の結  絖激鴻堺羈(泣若鴻帥激潟腟粋昭帥若
 果の最後に戻り値があるときは, {\tt OperandStack} に戻り値を push する.  荐茯)c潟潟絎茵.  潟潟絎茵腟
 正常終了なら 0 を, 異常終了なら -1 をもどす.  debug モードにはいった場  緇祉ゃ, {\tt OperandStack} 祉ゃ push .
 合, -2 を戻す. エラーの時 Error2 Objectを stack へ push する.\\ {\tt  OpenXM с, 憜∽医罔羣c.
 kan/sm1} の場合, サーバスタックマシンの組み込みローカル言語は{\tt sm1}  ∽違 {\tt popString} 罘純絎憗, 篏 open XM
 ポストスクリプト言語である.  サーバスタックマシンと, {\tt sm1} ポスト  泣若.  絎茖с, 障篋ゃ∽違罘純絎憗鴻с.
 スクリプト言語はスタックを共有するように実装されている.  実際の計算は  
 {\tt executeStringByLocalParser} により実行される.  open XM では, 現在  
 のところ関数名の標準化はおこなっていない.  したがって, 実際の計算コマ  
 ンドの送出は mathcap をみてクライアントが正しいコマンドを選択する必要  
 がある. (しかしながら, 共通関数名がないために, 共通仕様のサーバスタッ  
 クマシンの実装はきわめて簡単である. 関数名の共通化は将来の課題.) \\割  
 込みに関しては, -1 を戻すように ハンドラを書く.  
 executeStringByLocalParser() を再帰的に呼んだときも 割り込みのハンドラ  
 が正しく動作するようにこの関数は書かれるべきである.  この関数を呼び出  
 したのち, signal, setjmp の再設定を呼び出し側でやらないといけない. \\  
 この関数および {\tt popString} の機能を実現すれば, 最低限の open XM の  
 サーバになれる.  実装では, まずこの二つの関数の機能を実現すべきである.  
 */  */
 /*&eg  /*&eg
 A character string $s$ is parsed by the local parser of the stack  It requests a server to pop a character string {\tt s}, to
 machine and interpreted by the local interpreter.  parse it by the local parser of the stack machine,  and
 If the exececution produces a result, it is pushed onto  to interpret by the local interpreter.
   If the execution produces a Output, it is pushed onto
 {\tt OperandStack}.  {\tt OperandStack}.
 If an error has occured,  Error2 Object is pushed onto the stack.  If an error has occurred,  Error2 Object is pushed onto the stack.
 OpenXM does not provide standard function names.  OpenXM does not provide standard function names.
 If this operation and {\tt SM\_popString} is implemented, the stack machine  If this operation and {\tt SM\_popString} is implemented, the stack machine
 can be used as an OX server.  is ready to be used as an OX server.
 */  */
   
 Stack before the request:  Stack before the request:
Line 306  Request: 
Line 307  Request: 
 \hline  \hline
 \end{tabular}  \end{tabular}
   
 //&jp Result:  なし.  Output:  none.
 //&eg Result:  none.  
 /*&jp  /*&jp
 \noindent  \noindent
 参考: \  実行前のスタックのデータは,  : \  絎茵鴻帥若帥,
 {\it String commandString} なる local stackmachine の object としてス  {\it String commandString} local stack machine object
 タック上にあるが, TCP/IP の通信路では, 次のようなデータがまずながれて  帥筝, TCP/IP 篆∴君с, 罨<若帥障
 {\it commandName} がスタックに push される:  {\it commandName} 鴻帥 push :
 */  */
 /*&eg  /*&eg
 \noindent  \noindent
Line 330  onto the stack. It is done by sending the following OX
Line 330  onto the stack. It is done by sending the following OX
 SM_executeStringByLocalParserInBatchMode  SM_executeStringByLocalParserInBatchMode
 \end{verbatim}  \end{verbatim}
 /*&jp  /*&jp
 スタックに副作用がない(スタックにたいしてなんの操作もしない)ことを除き  鴻帥篏(鴻帥篏)ゃ
 上とまったく同じ関数である.  エラーの時のみ, Error2 Object をスタック  筝障c∽違с.  若, Error2 Object 鴻帥
 へプッシュする.  吾激ャ.
 */  */
 /*&eg  /*&eg
 This is the same request as {\tt SM\_executeStringByLocalParser}  This is the same request as {\tt SM\_executeStringByLocalParser}
 except that it does not modify the stack. It pushes an Error2 Object  except that it does not modify the stack. It pushes an Error2 Object
 if an error has occured.  if an error has occurred.
 */  */
 \item  \item
 \begin{verbatim}  \begin{verbatim}
 SM_popString  SM_popString
 \end{verbatim}  \end{verbatim}
 /*&jp  /*&jp
 {\tt OperandStack} より Object を pop し, それを xxx の出力規則にしたがい文  {\tt OperandStack} Object pop , xxx 阪荀
 字列型に変換して送信する.  スタックが空のときは, {\tt (char *)NULL} を戻す.  絖紊篆<.  鴻帥腥冴, {\tt (char *)NULL} 祉.
 文字列は {\tt ox\_stream out}へ CMO のデー  絖 TCP/IP stream CMO
 タとして送信する.  エラーの場合は {\tt CMO\_ERROR2} を戻すべきである.  帥篆<.  若翫 {\tt CMO\_ERROR2} 祉鴻с.
 */  */
 /*&eg  /*&eg
 It requests for a server to pop an object from {\tt OperandStack},  It requests a server to pop an object from {\tt OperandStack},
 to convert it into a character string according to the output format  to convert it into a character string according to the output format
 of the local system, and to send the character string via TCP/IP stream.  of the local system, and to send the character string via TCP/IP stream.
 {\tt (char *)NULL} is returned when the stack is empty.  {\tt (char *)NULL} is returned when the stack is empty.
 The returned strings is sent as a CMO string data.  The returned string is sent as a CMO string data.
 {\tt CMO\_ERROR2} should be returned if an error has occured.  {\tt CMO\_ERROR2} should be returned if an error has occurred.
 */  */
   
 Stack before the request:  Stack before the request:
Line 370  Request:
Line 370  Request:
 \hline  \hline
 \end{tabular}  \end{tabular}
   
 Result:  Output:
 \begin{tabular}{|c|c|c|}  \hline  \begin{tabular}{|c|c|c|}  \hline
 {\tt int32 OX\_DATA} & {\tt int32 CMO\_STRING} & {\it size and the string s} \\  {\tt int32 OX\_DATA} & {\tt int32 CMO\_STRING} & {\it size and the string s} \\
 \hline  \hline
Line 381  Result: 
Line 381  Result: 
 SM_getsp  SM_getsp
 \end{verbatim}  \end{verbatim}
 /*&jp  /*&jp
 現在のスタックポインタの位置をもどす.  スタート時点での位置は 0 であり,  憜鴻帥ゃ潟帥篏臀.  鴻帥若鴻с篏臀 0 с,
 object が push されたばあい, 1 づつ増えるものとする.  object push 違, 1 ャゅ.
 */  */
 /*&eg  /*&eg
 It request to push the current stack pointer onto the stack.  It requests a server to push the current stack pointer onto the stack.
 The stack pointer is represented by a non-negative integer.  The stack pointer is represented by a non-negative integer.
 Its initial value is 0 and a push operation increments the  Its initial value is 0 and a push operation increments the
 stack pointer by 1.  stack pointer by 1.
Line 403  Request:
Line 403  Request:
 \hline  \hline
 \end{tabular}  \end{tabular}
   
 Result:  Stack after the request:
 \begin{tabular}{|c|c|c|}  \hline  \begin{tabular}{|c|c|c|}  \hline
 {\tt int32 OX\_DATA} & {\tt int32 CMO\_INT32} & {\it stack pointer value} \\  {\tt int32 OX\_DATA} & {\tt int32 CMO\_INT32} & {\it stack pointer value} \\
 \hline  \hline
 \end{tabular}  \end{tabular}
   
   Output:  none.
   
 \item  \item
 \begin{verbatim}  \begin{verbatim}
 SM_dupErrors  SM_dupErrors
 \end{verbatim}  \end{verbatim}
 /*&jp  /*&jp
 スタック上のエラーオブジェクトをリストにして戻す.  スタック自体は変化  鴻帥筝若吾с鴻祉.  鴻帥篏紊
 させない.  .
 */  */
 /*&eg  /*&eg
 It requests to push a list object containing all error objects on the stack.  It requests a server to push a list object containing all error objects on the stack.
 */  */
   
 Stack before the request:  Request:
 \begin{tabular}{|c|}  \hline  \begin{tabular}{|c|c|}  \hline
 {\it Object} \\  {\tt int32 OX\_COMMAND} & {\tt int32 SM\_dupErrors} \\
 \hline  \hline
 \end{tabular}  \end{tabular}
   
   Stack after the request:
   \begin{tabular}{|c|c|c|}  \hline
   {\tt int32 OX\_DATA} & {\sl CMObject} \ a list of errors\\
   \hline
   \end{tabular}
   
   Output: none.
   
   \item
   \begin{verbatim}
   SM_pushCMOtag
   \end{verbatim}
   /*&jp
   鴻帥吾с CMO 紊翫 CMO tag
   {\tt CMO\_INT32} 鴻帥 push .
   吾с鴻帥障.
   吾сCMO 後号<翫, object 腥.
   */
   /*&eg
   It requests a server to push the CMO tag of the top object on the server
   stack. The tag is pushed as {\tt CMO\_INT32}.
   The top object remains on the stack.
   If there is no way to translate the object into CMO,
   push an error object.
   */
   
 Request:  Request:
 \begin{tabular}{|c|c|}  \hline  \begin{tabular}{|c|c|}  \hline
 {\tt int32 OX\_COMMAND} & {\tt int32 SM\_dupErrors} \\  {\tt int32 OX\_COMMAND} & {\tt int32 SM\_pushCMOtag} \\
 \hline  \hline
 \end{tabular}  \end{tabular}
   
 Result:  Stack after the request:
 \begin{tabular}{|c|c|c|}  \hline  \begin{tabular}{|c|c|c|}  \hline
 {\tt int32 OX\_DATA} & {\sl CMObject} \ a list of errors\\  {\tt int32 OX\_DATA} & {\sl CMO\_INT32} \ tag\\
 \hline  \hline
 \end{tabular}  \end{tabular}
   
   Output: none.
 \end{enumerate}  \end{enumerate}
   
 \medbreak  \medbreak
 \noindent  \noindent
   
   //&C \subsubsection{ MathCap }  \label{subsubsection:mathcap}
   
 /*&jp  /*&jp
 {\bf 例}: \  {\bf 箴}: \
 mathcap の問い合わせに対して, {\tt ox\_sm1} は次のように答える.  mathcap 絲障, {\tt ox\_sm1} 罨<膈.
 */  */
 /*&eg  /*&eg
 {\bf Example}: \  {\bf Example}: \
 {\tt ox\_sm1} returns the following data as its mathcap.  {\tt ox\_sm1} returns the following data as its mathcap.
 */  */
 %%Prog: [(cmoMathCap)] extension ::  %%Prog: [(cmoMathcap)] extension ::
 \begin{verbatim}  \begin{verbatim}
 Class.mathcap  Class.mathcap
  [ [199909080 , $Ox_system=ox_sm1.plain$ , $Version=2.990911$ ,   [ [199909080 , $Ox_system=ox_sm1.plain$ , $Version=2.990911$ ,
Line 461  Class.mathcap 
Line 494  Class.mathcap 
 \end{verbatim}  \end{verbatim}
   
 /*&jp  /*&jp
 mathcap は 3つの要素をもつリストである.  まづ, 最初の要素を見よう.  mathcap 3や札筝荀膣ゃ鴻с.  障, 荀膣(鴻)荀.
 Ox\_system は open xxx システム名である.  読み込むライブラリがちがって  鴻医 OpenXM 潟若吾с潟с.
 いて, 関数名(または シンボル)の意味がちがうときはこの名前もかえる. た  Ox\_system openXM 激鴻с.  茯粋昭ゃ<c
 とえば, open math の basic content dictionary 対応の関数定義マクロを読  , ∽医(障 激潟)潟<.
 みこんだ sm1 は, ox\_sm1\_basicCD なる名前にする.  HOSTTYPE値は, CPU  , open math basic content dictionary 絲上∽医臂茯
 の種類をあらわしunix では環境変数\verb+$HOSTTYPE+ の値である.  2 番目  帥 sm1 , ox\_sm1\_basicCD .  HOSTTYPE ゃ, CPU
 の要素は 利用可能な SM コマンドをあつめたリストである.  3 番目のリスト  腮蕁unix с医紊\verb+$HOSTTYPE+ ゃс.  2
 は, 処理可能な数学データの形式, およびCMOの場合なら処理可能なCMOのタグ  荀膣 純 SM 潟潟ゃ鴻с.  3 鴻
 のリストが続く.  上の例では, 514 は {\tt OX\_DATA} をあらわし, 数学デー  , 純医若帥綵√, CMO翫純CMO帥
 タのフォマットは(サイズ情報なしの) CMO であることを示す.  鴻膓.  筝箴с, 514 {\tt OX\_DATA} , 医
   帥(泣ゃ堺宴) CMO с腓冴.
   鴻 optinal , CMO string 鴻с.
   絖 option, 障 option=, 綵√т.
   option 掩医潟≪潟若若ц菴. = 篁ヤ utf-8 絖潟若.
 */  */
 /*&eg  /*&eg
 A mathcap has three components. The first one contains informations  A mathcap has three or more than three components.
 to identify the system and hosts on which the application runs.  The first one, which is also a list,
 In the above example, Ox\_system denotes the system name.  contains informations
 HOSTTYPE represents the OS type and taken from \verb+$HOSTTYPE+  to identify the version number of the OpenXM protocol,
   the system and hosts on which the application runs.
   In the above example, {\tt Ox\_system} denotes the system name.
   {\tt HOSTTYPE} represents the OS type and taken from \verb+$HOSTTYPE+
 enviroment variable.  enviroment variable.
 The second component consists of avaiable SM commands.  The second component consists of avaiable SM commands.
 The third component is a list of pairs. Each pair consists  The third component is a list of pairs. Each pair consists
 of an OX message tag and the available message tags.  of an OX message tag and the list of available message tags.
 Again in the above example, 514 is the value of {\tt OX\_DATA}  Again in the above example, 514 is the value of {\tt OX\_DATA}
 and it indicates that the server accepts CMO (without size information)  and it indicates that the server accepts CMO (without size information)
 as mathematical data messages. In this case the subsequent  as mathematical data messages. In this case the subsequent
 list represents available CMO tags.  list represents available CMO tags.
   The fourth list is optinal.
   This is a list of cmo strings.
   Each string has the formats ``an option name'' or ``an optionname=value''.
   The option name must consists only of alphabets, numbers, and under bars.
   The symbol = may be followed by a string in the utf-8 character codes.
 */  */
   
   /*&C
   \noindent
   OpenXM/XML expression of the example above:
   \begin{verbatim}
     <cmo_mathcap>
        <cmo_list for="mathcap">
   
          <cmo_list>
             <int32 for="length"> 4 </int32>
             <cmo_int32 for="Protocol version">  001001003 </cmo_int32>
             <cmo_string for="system name"> Ox_system=ox_sm1.plain  </cmo_string>
             <cmo_string for="system version"> Version=2.990911  </cmo_string>
             <cmo_string for="hosttype"> HOSTTYPE=i386  </cmo_string>
          </cmo_list>
   
          <cmo_list for="Available SM tags">
             <int32 for="length"> 11 </int32>
             <cmo_int32> 262 </cmo_int32>
             <cmo_int32> 263 </cmo_int32>
              ...
          </cmo_list>
   
          <cmo_list for="Available OX_DATA tags">
             <int32 for="length"> 2 </int32>
             <cmo_list for="OX_DATA tag">
                <int32 for="length"> 1 </int32>
                <cmo_int32 comment="OX_DATA">  514 </cmo_int32>
             </cmo_list>
             <cmo_list for="Available CMO tags">
                <int32 for="length"> 21 </int32>
                <cmo_int32 comment="CMO_ERROR2">  2130706434 </cmo_int32>
                <cmo_int32 comment="CMO_NULL"> 1 </cmo_int32>
                 ....
             </cmo_list>
   
          </cmo_list>
        </cmo_list>
     </cmo_mathcap>
   \end{verbatim}
   */
   
   /*&C
   \noindent
   Example of the use of the fourth argument (optional parameter).
   \begin{verbatim}
     <cmo_mathcap>
        <cmo_list for="mathcap">
   
          <cmo_list>
             <int32 for="length"> 4 </int32>
             <cmo_int32 for="Protocol version">  001001003 </cmo_int32>
             <cmo_string for="system name"> Ox_system=ox_sm1.plain  </cmo_string>
             <cmo_string for="system version"> Version=2.990911  </cmo_string>
             <cmo_string for="hosttype"> HOSTTYPE=i386  </cmo_string>
          </cmo_list>
   
          <cmo_list for="Available SM tags">
             <int32 for="length"> 11 </int32>
             <cmo_int32> 262 </cmo_int32>
             <cmo_int32> 263 </cmo_int32>
              ...
          </cmo_list>
   
          <cmo_list for="Available OX_DATA tags">
             <int32 for="length"> 2 </int32>
             <cmo_list for="OX_DATA tag">
                <int32 for="length"> 1 </int32>
                <cmo_int32 comment="OX_DATA">  514 </cmo_int32>
             </cmo_list>
             <cmo_list for="Available CMO tags">
                <int32 for="length"> 21 </int32>
                <cmo_int32 comment="CMO_ERROR2">  2130706434 </cmo_int32>
                <cmo_int32 comment="CMO_NULL"> 1 </cmo_int32>
                 ....
             </cmo_list>
          </cmo_list>
   
          <cmo_list for="optional info">
             <int32 for="length"> 2 </int32>
             <cmo_string> no_ox_reset </cmo_string>
             <cmo_string> opt_sample=Hello world. </cmo_string>
          </cmo_list>
   
        </cmo_list>
     </cmo_mathcap>
   \end{verbatim}
   */
   
 \medbreak  \medbreak
   
   //&jp \subsubsection{ 箴 }
   //&eg \subsubsection{ Examples }
   
 \noindent  \noindent
 //&jp {\bf 例}: \  //&jp {\bf 箴}: \
 //&eg {\bf Example}: \  //&eg {\bf Example}: \
 %%Prog: (ox.sm1) run  sm1connectr  [(oxWatch) ox.ccc] extension  %%Prog: (ox.sm1) run  sm1connectr  [(oxWatch) ox.ccc] extension
 %%Prog: ox.ccc (122345; ) oxsubmit ;  %%Prog: ox.ccc (122345; ) oxsubmit ;
 //&jp {\tt message\_body} の実例をあげる.   シリアル番号部は除いてある.  //&jp {\tt message\_body} 絎箴.   激≪埌ゃ.
 //&eg {\tt message\_body} の実例をあげる.   シリアル番号部は除いてある.  //&eg We show examples of {\tt message\_body}. Serial numbers are omitted.
 \begin{enumerate}  \begin{enumerate}
 \item  {\tt executeStringByLocalParser("12345 ;");}  \item  {\tt executeStringByLocalParser("12345 ;");}
 /*&jp  /*&jp
 は次のようなパケットに変換される. 各数字は 16進1バイトをあらわす.  罨<宴紊. 医 161ゃ.
 {\tt xx(yy)} のなかの {\tt (yy)} は対応するアスキーコードをあわらす.  {\tt xx(yy)} {\tt (yy)} 絲上≪鴻若潟若.
 */  */
 /*&eg  /*&eg
 は次のようなパケットに変換される. 各数字は 16進1バイトをあらわす.  is converted into the following packet. Each number denotes
 {\tt xx(yy)} のなかの {\tt (yy)} は対応するアスキーコードをあわらす.  one byte in hexadecimal representation.
   {\tt (yy)} in {\tt xx(yy)} represents the corresponding ASCII code.
 */  */
 \begin{verbatim}  \begin{verbatim}
 0   0   2   2   0   0   0   4   0   0   0   7  0   0   2   2   0   0   0   4   0   0   0   7
Line 511  list represents available CMO tags.
Line 649  list represents available CMO tags.
 0   0   2   1   0   0   1   c  0   0   2   1   0   0   1   c
 \end{verbatim}  \end{verbatim}
 /*&jp  /*&jp
 ここで,  若帥潟罨<с.
 \verb+ 0 0 2 2 0 0 0 4 + は, network byte order で,  
 順番に {\tt OX\_DATA} それから,  
 CMO のタグの, {\tt CMO\_STRING} を表す.  
 \verb+ 0  0  0  7 + は文字数,  
 最後に 文字列 {\tt 12345 ;} が来る.  
 ここで, \verb+ 0 0 1 c + は, network byte order で,  
 {\tt OX\_executeString} を表す.  
 */  */
 /*&eg  /*&eg
 ここで,  Each data has the following meaning.
 \verb+ 0 0 2 2 0 0 0 4 + は, network byte order で,  
 順番に {\tt OX\_DATA} それから,  
 CMO のタグの, {\tt CMO\_STRING} を表す.  
 \verb+ 0  0  0  7 + は文字数,  
 最後に 文字列 {\tt 12345 ;} が来る.  
 ここで, \verb+ 0 0 1 c + は, network byte order で,  
 {\tt OX\_executeString} を表す.  
 */  */
   
 //&jp まとめると次のようになる.  
 //&eg まとめると次のようになる.  
 \begin{verbatim}  \begin{verbatim}
 0   0   2   2  (OX_DATA) 0   0   0   4  (CMO_STRING)  0   0   2   2  (OX_DATA) 0   0   0   4  (CMO_STRING)
 0   0   0   7  (size)  0   0   0   7  (size)
Line 540  CMO のタグの, {\tt CMO\_STRING} を表す.
Line 662  CMO のタグの, {\tt CMO\_STRING} を表す.
 0   0   2   1  (OX_COMMAND)  0   0   2   1  (OX_COMMAND)
 0   0   1   c  (SM_executeStringByLocalParser)  0   0   1   c  (SM_executeStringByLocalParser)
 \end{verbatim}  \end{verbatim}
 //&jp これを OXexpression で表記すると次のようになる.  //&jp OXexpression ц;荐罨<.
 //&eg これを OXexpression で表記すると次のようになる.  //&eg This is expressed by OXexpression as follows.
 \begin{center}  \begin{center}
 (OX\_DATA, (CMO\_STRING, 7, "12345 ;"))  (OX\_DATA, (CMO\_STRING, 7, "12345 ;"))
 \end{center}  \end{center}
Line 549  CMO のタグの, {\tt CMO\_STRING} を表す.
Line 671  CMO のタグの, {\tt CMO\_STRING} を表す.
 (OX\_COMMAND, (SM\_executeStringByLocalParser))  (OX\_COMMAND, (SM\_executeStringByLocalParser))
 \end{center}  \end{center}
   
 //&jp \item  {\tt popString()}  を要請するメッセージ:  //&jp \item  {\tt popString()}  荀茫<祉若:
 //&eg \item  {\tt popString()}  を要請するメッセージ:  //&eg \item  A message which requests {\tt SM\_popString}:
 \begin{verbatim}  \begin{verbatim}
 0   0   2   1  (OX_COMMAND)  0   0   2   1  (OX_COMMAND)
 0   0   1   7  (SM_popString)  0   0   1   7  (SM_popString)
 \end{verbatim}  \end{verbatim}
 OXexpression では  //&jp OXexpression с
   //&eg In OXexpression it is represented as
 (OX\_COMMAND, (SM\_popString)).  (OX\_COMMAND, (SM\_popString)).
   
 \noindent  \noindent
 //&jp これにたいして次の返答メッセージがくる.  //&jp 罨<菴膈<祉若吾.
 //&eg これにたいして次の返答メッセージがくる.  //&eg The server returns the following reply message:
 \begin{verbatim}  \begin{verbatim}
 0   0   2   2   (OX_DATA)  0   0   2   2   (OX_DATA)
 0   0   0   4   (CMO_STRING) 0   0   0   5  (size)  0   0   0   4   (CMO_STRING) 0   0   0   5  (size)
 31(1)  32(2)  33(3)  34(4)  35(5)  31(1)  32(2)  33(3)  34(4)  35(5)
 \end{verbatim}  \end{verbatim}
 //&jp OXexpression でかくと,  //&jp OXexpression с,
 //&eg OXexpression でかくと,  //&eg In OXexpression it is represented as
 (OX\_DATA, (CMO\_STRING, 7, "12345 ;")).  (OX\_DATA, (CMO\_STRING, 7, "12345 ;")).
 \end{enumerate}  \end{enumerate}
   
 //&jp \subsubsection{グループ SMobject/Basic1 に属するオペレータ}  //&jp \subsubsection{違若 SMobject/Basic 絮若}
 //&eg \subsubsection{グループ SMobject/Basic1 に属するオペレータ}  //&eg \subsubsection{Operators in the group SMobject/Basic}
   
 \begin{enumerate}  \begin{enumerate}
 \item  \item
 \begin{verbatim}  \begin{verbatim}
 void xxx_pops(int n)  SM_pops
 \end{verbatim}  \end{verbatim}
 /*&jp  /*&jp
 operand stack より, {\it n} 個の元 ({\it obj1, obj2, $\ldots$, objn})  operand stack , {\it n} ({\it obj1, obj2, $\ldots$, objn}
 を pop して捨てる.   pop .
 */  */
 /*&eg  /*&eg
 operand stack より, {\it n} 個の元 ({\it obj1, obj2, $\ldots$, objn})  It requests a server to pop {\it n} and to discard elements {\it obj1, obj2,
 を pop して捨てる.  $\ldots$, objn} from the stack.
 */  */
   
 //&jp Stack before the request: (右が stack のトップである.) \\  //&jp Stack before the request: \\
 //&eg Stack before the request: (右が stack のトップである.) \\  //&eg Stack before the request: \\
 \begin{tabular}{|c|c|c|c|c|}  \hline  \begin{tabular}{|c|c|c|c|c|}  \hline
 {\it obj1} & {\it  obj2}  & $\cdots$ & {\it objn}  &{\it INT32 n} \\  {\it obj1} & {\it  obj2}  & $\cdots$ & {\it objn}  &{\it Integer32 n} \\
 \hline  \hline
 \end{tabular}  \end{tabular}
   
Line 601  Request:
Line 724  Request:
 \hline  \hline
 \end{tabular}  \end{tabular}
   
 //&jp Result:  なし.  Output:  none.
 //&eg Result:  none.  
   
   
 \item  \item
 \begin{verbatim}  \begin{verbatim}
 int xxx_setName(char *name)  int SM_setName
 \end{verbatim}  \end{verbatim}
 /*&jp  /*&jp
 {\tt OperandStack} より {\it name} を pop し, つぎに{\tt OperandStack}  {\tt OperandStack} {\it name} pop , ゃ{\tt OperandStack}
 より {\it obj} を pop し, それを現在の名前空間で変数 {\it name} に   {\it obj} pop , 憜腥咲у {\it name}
 bind する.  正常終了なら 0 を, 異常終了なら -1 をもどす.  TCP/IP によ  bind .  罩e幻腟篋 0 , 医幻腟篋 -1 .  TCP/IP
 る通信では, 異常終了の時のみ, {\tt CMO\_ERROR2} をstack へ push する.  篆<с, 医幻腟篋, {\tt CMO\_ERROR2} stack push .
 */  */
 /*&eg  /*&eg
 {\tt OperandStack} より {\it name} を pop し, つぎに{\tt OperandStack}  It requests a server to pop {\it name}, to pop {\it obj}, and to
 より {\it obj} を pop し, それを現在の名前空間で変数 {\it name} に  bind {\it obj} to a variable {\it name} in the current name space
 bind する.  正常終了なら 0 を, 異常終了なら -1 をもどす.  TCP/IP によ  of the server.
 る通信では, 異常終了の時のみ, {\tt CMO\_ERROR2} をstack へ push する.  If an error has occurred {\tt CMO\_ERROR2} is pushed onto the stack.
 */  */
 //&jp Stack before the request: (右が stack の top.)  //&jp Stack before the request:
 //&eg Stack before the request: (右が stack の top.)  //&eg Stack before the request:
 \begin{tabular}{|c|c|}  \hline  \begin{tabular}{|c|c|}  \hline
 {\it obj} & {\it String name}  \\  {\it obj} & {\it String name}  \\
 \hline  \hline
Line 634  Request:
Line 756  Request:
 \hline  \hline
 \end{tabular}  \end{tabular}
   
 //&jp Result: なし.  Output: none.
 //&eg Result: none.  
   
 \item  \item
 \begin{verbatim}  \begin{verbatim}
 int xxx_evalName(char *name)  SM_evalName
 \end{verbatim}  \end{verbatim}
   
 /*&jp  /*&jp
 現在の名前空間で変数 {\it name} を評価する.  評価の結果 {\it  憜腥咲у {\it name} 荅箴<.  荅箴<腟 {\it
 resultObj} をスタックへ戻す.  関数自体は正常終了なら 0 を, 異常終了な  OutputObj} 鴻帥御祉.  ∽域篏罩e幻腟篋 0 , 医幻腟篋
 ら -1 をもどす.  TCP/IP の場合, 異常終了の場合のみ {\tt CMO\_ERROR2}   -1 .  TCP/IP 翫, 医幻腟篋翫 {\tt CMO\_ERROR2}
 を stack へ push する.   stack push .
 */  */
   
 /*&eg  /*&eg
 現在の名前空間で変数 {\it name} を評価する.  評価の結果 {\it  It requests a server to pop {\it name} and to evaluate a variable
 resultObj} をスタックへ戻す.  関数自体は正常終了なら 0 を, 異常終了な  {\it name} in the current name space. The Output of the evaluation
 ら -1 をもどす.  TCP/IP の場合, 異常終了の場合のみ {\tt CMO\_ERROR2}  {\it OutputObj} is pushed to the stack.
 を stack へ push する.  If an error has occurred {\tt CMO\_ERROR2} is pushed onto the stack.
 */  */
   
 //&jp Stack before the request: (右が stack の top.)  //&jp Stack before the request:
 //&eg Stack before the request: (右が stack の top.)  //&eg Stack before the request:
 \begin{tabular}{|c|}  \hline  \begin{tabular}{|c|}  \hline
 {\it String name}  \\  {\it String name}  \\
 \hline  \hline
Line 667  Request:
Line 790  Request:
 \hline  \hline
 \end{tabular}  \end{tabular}
   
 //&jp Stack after the request: (右が stack の top.)  //&jp Stack after the request:
 //&eg Stack after the request: (右が stack の top.)  //&eg Stack after the request:
 \begin{tabular}{|c|}  \hline  \begin{tabular}{|c|}  \hline
 {\it resultObj} \\  {\it OutputObj} \\
 \hline  \hline
 \end{tabular}  \end{tabular}
   
 //&jp Result:  なし.  Output:  none.
 //&eg Result:  none.  
   
 \item  \item
 \begin{verbatim}  \begin{verbatim}
 int xxx_executeFunction(char *s, int n)  SM_executeFunction
 \end{verbatim}  \end{verbatim}
 /*&jp  /*&jp
 スタックより {\it n} 個のデータを pop して, サーバのローカル関数{\it  鴻帥 {\it n} 若帥 pop , 泣若若∽{\it
 s} を実行する.  エラーのときのみ {\tt CMO\_ERROR2} を stack へ push す  s} 絎茵.  若 {\tt CMO\_ERROR2} stack push
 る.  .
 */  */
 /*&eg  /*&eg
 スタックより {\it n} 個のデータを pop して, サーバのローカル関数{\it  It requests a server to pop {\it s} as a function name,
 s} を実行する.  エラーのときのみ {\tt CMO\_ERROR2} を stack へ push す  to pop {\it n} as the number of arguments and to execute
 る.  a local function {\it s} with {\it n} arguments popped from
   the stack.
   If an error has occurred {\tt CMO\_ERROR2} is pushed to the stack.
 */  */
   
 //&jp Stack before the request: (右が stack の top.) \\  //&jp Stack before the request: \\
 //&eg Stack before the request: (右が stack の top.) \\  //&eg Stack before the request: \\
 \begin{tabular}{|c|c|c|c|c|}  \hline  \begin{tabular}{|c|c|c|c|c|}  \hline
 {\it objn} & $\cdots$ & {\it obj1} & {\it INT32 n} & {\it String s} \\  {\it objn} & $\cdots$ & {\it obj1} & {\it INT32 n} & {\it String s} \\
 \hline  \hline
Line 705  Request:
Line 829  Request:
 \hline  \hline
 \end{tabular}  \end{tabular}
   
 //&jp Stack after the request: 関数実行の結果.  //&jp Stack after the request: ∽医茵腟.
 //&eg Stack after the request: 関数実行の結果.  //&eg Stack after the request: The Output of the execution.
   
 //&jp Result: なし.  Output: none.
 //&eg Result: none.  
   
 \item  \item
 \begin{verbatim}  \begin{verbatim}
 bytes *xxx_popSerializedLocalObject(void)  SM_popSerializedLocalObject
 void popSerializedLocalObject(ox_stream out)  
 \end{verbatim}  \end{verbatim}
   
 /*&jp  /*&jp
 最初の関数はライブラリとしてリンクして使用するための関数である.  スタッ  鴻帥 pop object local 綵√ serialization
 クより pop した object を local 形式の serialization してbyte 列で戻す.  OX message stream 後阪. OX message tag ,
 2 番目の関数は Socket で通信するための同機能の関数であり,  local 綵√絲上絎臂綽荀с.
 serialization された byte 列を{\tt ox\_stream out} へ出力する.  この場  ∽違, homogeneous c激鴻х.
 合, header {\tt int32 OX\_DATA}, {\tt int32 CMO\_LOCAL\_OBJECT} をつけ  
 てから, byte 列を送る. この関数はおもに, homogeneous な分散システムで  
 用いる.  次に, サーバスタックマシンの関数が実行されるまでは,戻り  
 object の内容は保証されないといけない.  
 */  */
 /*&eg  /*&eg
 最初の関数はライブラリとしてリンクして使用するための関数である.  スタッ  It requests a sever to pop an object, to convert it into a
 クより pop した object を local 形式の serialization してbyte 列で戻す.  serialized form according to a local serialization scheme, and
 2 番目の関数は Socket で通信するための同機能の関数であり,  to send it to the stream as an OX message.
 serialization された byte 列を{\tt ox\_stream out} へ出力する.  この場  An OX message tag corresponding to
 合, header {\tt int32 OX\_DATA}, {\tt int32 CMO\_LOCAL\_OBJECT} をつけ  the local data format must be sent prior to the serialized data
 てから, byte 列を送る. この関数はおもに, homogeneous な分散システムで  itself.
 用いる.  次に, サーバスタックマシンの関数が実行されるまでは,戻り  This operation is used mainly on homogeneous distributed systems.
 object の内容は保証されないといけない.  
 */  */
 \item  
 /*&jp  
 local serialized object, および サポートする CMO object を{\tt  
 OX\_DATA} として受信した場合, {\tt OperandStack} へpush する.  受信エ  
 ラーを起こしたときのみ, {\tt CMO\_ERROR2} を stack へ push する.  
 */  
 /*&eg  
 local serialized object, および サポートする CMO object を{\tt  
 OX\_DATA} として受信した場合, {\tt OperandStack} へpush する.  受信エ  
 ラーを起こしたときのみ, {\tt CMO\_ERROR2} を stack へ push する.  
 */  
   
 \item  \item
 \begin{verbatim}  \begin{verbatim}
 bytes *xxx_popCMO(void)  SM_popCMO
 void xxx_popCMO(ox_stream out)  
 \end{verbatim}  \end{verbatim}
   
 /*&jp  /*&jp
 最初の関数はライブラリとしてリンクして使用するための関数である.  {\tt  {\tt OperandStack} object pop CMO 綵√ serialized object
 OperandStack} より object を pop し CMO 形式の serialized object を  stream header {\tt OX\_DATA} ゃ.
 byte 列として戻す.  2 番目の関数は Socket で通信するための同機能の関数  
 であり, {\tt ox\_stream out } へ, そのデータを header {\tt OX\_DATA}  
 をつけてながす.  この関数はおもに, heterotic な分散システムで用いる.  
 次に, サーバスタックマシンの関数が実行されるまでは,戻り object の内容  
 は保証されないといけない.  
 */  */
 /*&eg  /*&eg
 最初の関数はライブラリとしてリンクして使用するための関数である.  {\tt  It requests a server to pop an object from the stack, to convert
 OperandStack} より object を pop し CMO 形式の serialized object を  it into a serialized form according to the standard CMO encoding scheme,
 byte 列として戻す.  2 番目の関数は Socket で通信するための同機能の関数  and to send it to the stream with the {\tt OX\_DATA} header.
 であり, {\tt ox\_stream out } へ, そのデータを header {\tt OX\_DATA}  
 をつけてながす.  この関数はおもに, heterotic な分散システムで用いる.  
 次に, サーバスタックマシンの関数が実行されるまでは,戻り object の内容  
 は保証されないといけない.  
 */  */
   
 Request:  Request:
Line 779  Request:
Line 876  Request:
 \hline  \hline
 \end{tabular}  \end{tabular}
   
 Result:  Output:
 \begin{tabular}{|c|c|}  \hline  \begin{tabular}{|c|c|}  \hline
 {\tt int32 OX\_DATA} &   {\it Serialized CMO} \\  {\tt int32 OX\_DATA} &   {\it Serialized CMO} \\
 \hline  \hline
 \end{tabular}  \end{tabular}
   
 //&jp 以下で, {\tt ox\_stream} はサンプルサーバの場合,  
 //&eg 以下で, {\tt ox\_stream} はサンプルサーバの場合,  \item
 \begin{verbatim}  \begin{verbatim}
 typedef FILE2 * ox_stream;  SM_executeFunctionWithOptionalArgument
 \end{verbatim}  \end{verbatim}
 //&jp である (cf. {\tt file2.h}). これは処理系によりちがってよい.  /*&jp
 //&jp {\tt ox\_asir} では, {\tt FILE *} を用いている.  鴻帥 {\it n} 若帥割ゃ optional 綣 {\it opt} pop ,
 //&eg である (cf. {\tt file2.h}). これは処理系によりちがってよい.  泣若若∽{\it s} 絎茵.  若 {\tt CMO\_ERROR2} stack push
 //&eg {\tt ox\_asir} では, {\tt FILE *} を用いている.  .
   {\it opt} 若若ゃ鴻鴻с. 若若絖с.
   */
   /*&eg
   It requests a server to pop {\it s} as a function name,
   to pop an optional argument {\it opt},
   to pop {\it n} as the number of arguments and to execute
   a local function {\it s} with {\it n} arguments popped from
   the stack.
   If an error has occurred {\tt CMO\_ERROR2} is pushed to the stack.
   {\it opt} is a list of lists of a keyword and a value.
   Keywords are strings.
   */
   
   //&jp Stack before the request: \\
   //&eg Stack before the request: \\
   \begin{tabular}{|c|c|c|c|c|c|}  \hline
   {\it objn} & $\cdots$ & {\it obj1} & {\it INT32 n} & {\it Obj opt} & {\it String s} \\
   \hline
   \end{tabular}
   
   Request:
   \begin{tabular}{|c|c|}  \hline
   {\tt int32 OX\_COMMAND} & {\tt int32 SM\_executeFunctionWithOptionalArgument}  \\
   \hline
   \end{tabular}
   
   //&jp Stack after the request: ∽医茵腟.
   //&eg Stack after the request: The Output of the execution.
   
   Output: none.
   
   \noindent
   Example of {\it opt} : \verb@ (("p", 13),("vars",("x","y")))@
   
   \noindent
   [Added in 2004-3-8]
   
 \end{enumerate}  \end{enumerate}
   

Legend:
Removed from v.1.2  
changed lines
  Added in v.1.14

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>